42 lines
1.3 KiB
Scala
42 lines
1.3 KiB
Scala
|
// See LICENSE.SiFive for license details.
|
||
|
|
||
|
package freechips.rocketchip.devices.tilelink
|
||
|
|
||
|
import Chisel._
|
||
|
import freechips.rocketchip.config.{Field, Parameters}
|
||
|
import freechips.rocketchip.coreplex._
|
||
|
import freechips.rocketchip.diplomacy._
|
||
|
import java.nio.{ByteBuffer, ByteOrder}
|
||
|
import java.nio.file.{Files, Paths}
|
||
|
|
||
|
/** Size, location and contents of the boot rom. */
|
||
|
case class BootROMParams(
|
||
|
address: BigInt = 0x10000,
|
||
|
size: Int = 0x10000,
|
||
|
hang: BigInt = 0x10040,
|
||
|
contentFileName: String)
|
||
|
case object BootROMParams extends Field[BootROMParams]
|
||
|
|
||
|
/** Adds a boot ROM that contains the DTB describing the system's coreplex. */
|
||
|
trait HasPeripheryBootROM extends HasPeripheryBus {
|
||
|
val dtb: DTB
|
||
|
private val params = p(BootROMParams)
|
||
|
private lazy val contents = {
|
||
|
val romdata = Files.readAllBytes(Paths.get(params.contentFileName))
|
||
|
val rom = ByteBuffer.wrap(romdata)
|
||
|
rom.array() ++ dtb.contents
|
||
|
}
|
||
|
def resetVector: BigInt = params.hang
|
||
|
|
||
|
val bootrom = LazyModule(new TLROM(params.address, params.size, contents, true, pbus.beatBytes))
|
||
|
|
||
|
bootrom.node := pbus.toVariableWidthSlaves
|
||
|
}
|
||
|
|
||
|
/** Coreplex will power-on running at 0x10040 (BootROM) */
|
||
|
trait HasPeripheryBootROMModuleImp extends LazyMultiIOModuleImp
|
||
|
with HasResetVectorWire {
|
||
|
val outer: HasPeripheryBootROM
|
||
|
global_reset_vector := UInt(outer.resetVector, width = resetVectorBits)
|
||
|
}
|