def generateDeviceTree(self, state): node = FdtNode("frame@{:08x}".format(self.cnt_base.value)) node.append(FdtPropertyWords("frame-number", self._frame_num)) ints = [0, int(self.int_phys.num) - 32, 4] if self.int_virt != NULL: ints.extend([0, int(self.int_virt.num) - 32, 4]) node.append(FdtPropertyWords("interrupts", ints)) reg = state.addrCells(self.cnt_base) + state.sizeCells(0x1000) if self.cnt_el0_base.value != MaxAddr: reg.extend(state.addrCells(self.cnt_el0_base) + state.sizeCells(0x1000)) node.append(FdtPropertyWords("reg", reg)) return node
def generateDeviceTree(self, state): node = FdtNode("timer") node.appendCompatible(["arm,cortex-a15-timer", "arm,armv7-timer", "arm,armv8-timer"]) node.append(FdtPropertyWords("interrupts", [ 1, int(self.int_phys_s.num) - 16, 0xf08, 1, int(self.int_phys_ns.num) - 16, 0xf08, 1, int(self.int_virt.num) - 16, 0xf08, 1, int(self.int_hyp.num) - 16, 0xf08, ])) if self._freq_in_dtb: node.append(self.counter.unproxy(self).generateDtb()) yield node
def generateDeviceTree(self, state): node = FdtNode("timer") node.appendCompatible(["arm,cortex-a15-timer", "arm,armv7-timer", "arm,armv8-timer"]) gic = self._parent.unproxy(self).gic node.append(FdtPropertyWords("interrupts", self.int_phys_s.generateFdtProperty(gic) + self.int_phys_ns.generateFdtProperty(gic) + self.int_virt.generateFdtProperty(gic) + self.int_hyp.generateFdtProperty(gic))) if self._freq_in_dtb: node.append(self.counter.unproxy(self).generateDtb()) yield node
def generateDeviceTree(self, state): node = FdtNode("timer") node.appendCompatible( ["arm,cortex-a15-timer", "arm,armv7-timer", "arm,armv8-timer"]) node.append( FdtPropertyWords("interrupts", [ 1, int(self.cntpsirq.num), 0xf08, 1, int(self.cntpnsirq.num), 0xf08, 1, int(self.cntvirq.num), 0xf08, 1, int(self.cnthpirq.num), 0xf08, ])) yield node
def generateDtb(self): if not self.freqs: fatal("No counter frequency to expose in DTB") return FdtPropertyWords("clock-frequency", [self.freqs[0]])
def _generate_device_tree(self, outdir: str) -> None: """Creates the dtb and dts files. Creates two files in the outdir: 'device.dtb' and 'device.dts' :param outdir: Directory to output the files """ state = FdtState(addr_cells=2, size_cells=2, cpu_cells=1) root = FdtNode("/") root.append(state.addrCellsProperty()) root.append(state.sizeCellsProperty()) root.appendCompatible(["riscv-virtio"]) for mem_range in self.mem_ranges: node = FdtNode("memory@%x" % int(mem_range.start)) node.append(FdtPropertyStrings("device_type", ["memory"])) node.append( FdtPropertyWords( "reg", state.addrCells(mem_range.start) + state.sizeCells(mem_range.size()), )) root.append(node) # See Documentation/devicetree/bindings/riscv/cpus.txt for details. cpus_node = FdtNode("cpus") cpus_state = FdtState(addr_cells=1, size_cells=0) cpus_node.append(cpus_state.addrCellsProperty()) cpus_node.append(cpus_state.sizeCellsProperty()) # Used by the CLINT driver to set the timer frequency. Value taken from # RISC-V kernel docs (Note: freedom-u540 is actually 1MHz) cpus_node.append(FdtPropertyWords("timebase-frequency", [100000000])) for i, core in enumerate(self.get_processor().get_cores()): node = FdtNode(f"cpu@{i}") node.append(FdtPropertyStrings("device_type", "cpu")) node.append(FdtPropertyWords("reg", state.CPUAddrCells(i))) node.append(FdtPropertyStrings("mmu-type", "riscv,sv48")) node.append(FdtPropertyStrings("status", "okay")) node.append(FdtPropertyStrings("riscv,isa", "rv64imafdc")) # TODO: Should probably get this from the core. freq = self.clk_domain.clock[0].frequency node.appendCompatible(["riscv"]) int_phandle = state.phandle(f"cpu@{i}.int_state") int_node = FdtNode("interrupt-controller") int_state = FdtState(interrupt_cells=1) int_phandle = state.phandle(f"cpu@{i}.int_state") int_node.append(int_state.interruptCellsProperty()) int_node.append(FdtProperty("interrupt-controller")) int_node.appendCompatible("riscv,cpu-intc") int_node.append(FdtPropertyWords("phandle", [int_phandle])) node.append(int_node) cpus_node.append(node) root.append(cpus_node) soc_node = FdtNode("soc") soc_state = FdtState(addr_cells=2, size_cells=2) soc_node.append(soc_state.addrCellsProperty()) soc_node.append(soc_state.sizeCellsProperty()) soc_node.append(FdtProperty("ranges")) soc_node.appendCompatible(["simple-bus"]) # CLINT node clint = self.clint clint_node = clint.generateBasicPioDeviceNode(soc_state, "clint", clint.pio_addr, clint.pio_size) int_extended = list() for i, core in enumerate(self.get_processor().get_cores()): phandle = state.phandle(f"cpu@{i}.int_state") int_extended.append(phandle) int_extended.append(0x3) int_extended.append(phandle) int_extended.append(0x7) clint_node.append(FdtPropertyWords("interrupts-extended", int_extended)) clint_node.appendCompatible(["riscv,clint0"]) soc_node.append(clint_node) # Clock clk_node = FdtNode("lupv-clk") clk_phandle = state.phandle(clk_node) clk_node.append(FdtPropertyWords("phandle", [clk_phandle])) clk_node.append(FdtPropertyWords("clock-frequency", [100000000])) clk_node.append(FdtPropertyWords("#clock-cells", [0])) clk_node.appendCompatible(["fixed-clock"]) root.append(clk_node) # LupioTMR lupio_tmr = self.lupio_tmr lupio_tmr_node = lupio_tmr.generateBasicPioDeviceNode( soc_state, "lupio-tmr", lupio_tmr.pio_addr, lupio_tmr.pio_size) int_state = FdtState(addr_cells=0, interrupt_cells=1) lupio_tmr_node.append(FdtPropertyWords("clocks", [clk_phandle])) int_extended = list() for i, core in enumerate(self.get_processor().get_cores()): phandle = state.phandle(f"cpu@{i}.int_state") int_extended.append(phandle) int_extended.append(self._excep_code['INT_TIMER_SUPER']) lupio_tmr_node.append( FdtPropertyWords("interrupts-extended", int_extended)) lupio_tmr_node.appendCompatible(["lupio,tmr"]) soc_node.append(lupio_tmr_node) # PLIC node plic = self.pic plic_node = plic.generateBasicPioDeviceNode(soc_state, "plic", plic.pio_addr, plic.pio_size) int_state = FdtState(addr_cells=0, interrupt_cells=1) plic_node.append(int_state.addrCellsProperty()) plic_node.append(int_state.interruptCellsProperty()) phandle = int_state.phandle(plic) plic_node.append(FdtPropertyWords("phandle", [phandle])) plic_node.append(FdtPropertyWords("riscv,ndev", 0)) int_extended = list() for i, core in enumerate(self.get_processor().get_cores()): phandle = state.phandle(f"cpu@{i}.int_state") int_extended.append(phandle) int_extended.append(0xB) int_extended.append(phandle) int_extended.append(0x9) plic_node.append(FdtPropertyWords("interrupts-extended", int_extended)) plic_node.append(FdtProperty("interrupt-controller")) plic_node.appendCompatible(["riscv,plic0"]) soc_node.append(plic_node) # LupioIPI Device lupio_ipi = self.lupio_ipi lupio_ipi_node = lupio_ipi.generateBasicPioDeviceNode( soc_state, "lupio-ipi", lupio_ipi.pio_addr, lupio_ipi.pio_size) int_extended = list() for i, core in enumerate(self.get_processor().get_cores()): phandle = state.phandle(f"cpu@{i}.int_state") int_extended.append(phandle) int_extended.append(self._excep_code['INT_SOFT_SUPER']) lupio_ipi_node.append( FdtPropertyWords("interrupts-extended", int_extended)) lupio_ipi_node.append(FdtProperty("interrupt-controller")) lupio_ipi_node.appendCompatible(["lupio,ipi"]) soc_node.append(lupio_ipi_node) # LupioPIC Device lupio_pic = self.lupio_pic lupio_pic_node = lupio_pic.generateBasicPioDeviceNode( soc_state, "lupio-pic", lupio_pic.pio_addr, lupio_pic.pio_size) int_state = FdtState(interrupt_cells=1) lupio_pic_node.append(int_state.interruptCellsProperty()) phandle = state.phandle(lupio_pic) lupio_pic_node.append(FdtPropertyWords("phandle", [phandle])) int_extended = list() for i, core in enumerate(self.get_processor().get_cores()): phandle = state.phandle(f"cpu@{i}.int_state") int_extended.append(phandle) int_extended.append(self._excep_code['INT_EXT_SUPER']) lupio_pic_node.append( FdtPropertyWords("interrupts-extended", int_extended)) lupio_pic_node.append(FdtProperty("interrupt-controller")) lupio_pic_node.appendCompatible(["lupio,pic"]) soc_node.append(lupio_pic_node) # LupioBLK Device lupio_blk = self.lupio_blk lupio_blk_node = lupio_blk.generateBasicPioDeviceNode( soc_state, "lupio-blk", lupio_blk.pio_addr, lupio_blk.pio_size) lupio_blk_node.appendCompatible(["lupio,blk"]) lupio_blk_node.append( FdtPropertyWords("interrupts", [self.lupio_blk.int_id])) lupio_blk_node.append( FdtPropertyWords("interrupt-parent", state.phandle(self.lupio_pic))) soc_node.append(lupio_blk_node) # LupioRNG Device lupio_rng = self.lupio_rng lupio_rng_node = lupio_rng.generateBasicPioDeviceNode( soc_state, "lupio-rng", lupio_rng.pio_addr, lupio_rng.pio_size) lupio_rng_node.appendCompatible(["lupio,rng"]) lupio_rng_node.append( FdtPropertyWords("interrupts", [self.lupio_rng.int_id])) lupio_rng_node.append( FdtPropertyWords("interrupt-parent", state.phandle(self.lupio_pic))) soc_node.append(lupio_rng_node) #LupioSYS Device lupio_sys = self.lupio_sys lupio_sys_node = lupio_sys.generateBasicPioDeviceNode( soc_state, "lupio-sys", lupio_sys.pio_addr, lupio_sys.pio_size) lupio_sys_node.appendCompatible(["syscon"]) sys_phandle = state.phandle(self.lupio_sys) lupio_sys_node.append(FdtPropertyWords("phandle", [sys_phandle])) soc_node.append(lupio_sys_node) poweroff_node = FdtNode("poweroff") poweroff_node.appendCompatible(["syscon-poweroff"]) poweroff_node.append(FdtPropertyWords("regmap", [sys_phandle])) poweroff_node.append(FdtPropertyWords("offset", [0x0])) poweroff_node.append(FdtPropertyWords("value", [1])) soc_node.append(poweroff_node) reboot_node = FdtNode("reboot") reboot_node.appendCompatible(["syscon-reboot"]) reboot_node.append(FdtPropertyWords("regmap", [sys_phandle])) reboot_node.append(FdtPropertyWords("offset", [0x4])) reboot_node.append(FdtPropertyWords("value", [1])) soc_node.append(reboot_node) # LupioRTC Device lupio_rtc = self.lupio_rtc lupio_rtc_node = lupio_rtc.generateBasicPioDeviceNode( soc_state, "lupio-rtc", lupio_rtc.pio_addr, lupio_rtc.pio_size) lupio_rtc_node.appendCompatible(["lupio,rtc"]) soc_node.append(lupio_rtc_node) # LupioTTY Device lupio_tty = self.lupio_tty lupio_tty_node = lupio_tty.generateBasicPioDeviceNode( soc_state, "lupio-tty", lupio_tty.pio_addr, lupio_tty.pio_size) lupio_tty_node.appendCompatible(["lupio,tty"]) lupio_tty_node.append( FdtPropertyWords("interrupts", [self.lupio_tty.int_id])) lupio_tty_node.append( FdtPropertyWords("interrupt-parent", state.phandle(self.lupio_pic))) soc_node.append(lupio_tty_node) root.append(soc_node) fdt = Fdt() fdt.add_rootnode(root) fdt.writeDtsFile(os.path.join(outdir, "device.dts")) fdt.writeDtbFile(os.path.join(outdir, "device.dtb"))