summaryrefslogtreecommitdiff
path: root/src/mainboard/emulation/spike-riscv
diff options
context:
space:
mode:
authorThaminda Edirisooriya <thaminda@google.com>2015-08-26 15:39:16 -0700
committerRonald G. Minnich <rminnich@gmail.com>2015-09-16 17:17:11 +0000
commita47738d10f9c6e4d14ffbd35a01c6e70c2c494e5 (patch)
treef760398a99d0a794f206268fc5e05c0b25ea0019 /src/mainboard/emulation/spike-riscv
parentebf623b53caea9fb1781668143fb3dc9fff08f6a (diff)
riscv-memlayout: fix existing memlayout issues, add sbi interface
Existing memlayout code placed sections in overlapping areas, and would overwrite the payload if it was large enough. Update memlayout.ld in src/mainboard/emulation/spike-riscv to represent the spike emulator, and add sbi interface which now has room into src/arch/riscv/bootblock.S. Add utility code to qemu-riscv, but emulator itself has yet to be updated to new ISA and as such should not be used. Update Makefile to include all the files necessary for sbi interface. Clean up unused include in src/arch/riscv/include/atomic.h and whitespace in src/mainboard/emulation/spike-riscv/memlayout.ld Fixed whitespace issues in spike_util.c Change-Id: Id97fe75e45ac1361005bec6d421756ee3f98a508 Signed-off-by: Thaminda Edirisooriya <thaminda@google.com> Reviewed-on: http://review.coreboot.org/11370 Tested-by: build bot (Jenkins) Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
Diffstat (limited to 'src/mainboard/emulation/spike-riscv')
-rw-r--r--src/mainboard/emulation/spike-riscv/memlayout.ld10
-rw-r--r--src/mainboard/emulation/spike-riscv/spike_util.c262
2 files changed, 136 insertions, 136 deletions
diff --git a/src/mainboard/emulation/spike-riscv/memlayout.ld b/src/mainboard/emulation/spike-riscv/memlayout.ld
index 8801f3520b..8e2e7eedf7 100644
--- a/src/mainboard/emulation/spike-riscv/memlayout.ld
+++ b/src/mainboard/emulation/spike-riscv/memlayout.ld
@@ -23,10 +23,10 @@
SECTIONS
{
- DRAM_START(0x0)
+ DRAM_START(0x0)
BOOTBLOCK(0x0, 64K)
- ROMSTAGE(0x20000, 128K)
- STACK(0x40000, 0x3ff00)
- PRERAM_CBMEM_CONSOLE(0x80000, 8K)
- RAMSTAGE(0x100000, 16M)
+ STACK(8M, 64K)
+ ROMSTAGE(8M + 64K, 128K)
+ PRERAM_CBMEM_CONSOLE(8M + 192k, 8K)
+ RAMSTAGE(8M + 200K, 256K)
}
diff --git a/src/mainboard/emulation/spike-riscv/spike_util.c b/src/mainboard/emulation/spike-riscv/spike_util.c
index 9edc62da2b..fca7d56ed0 100644
--- a/src/mainboard/emulation/spike-riscv/spike_util.c
+++ b/src/mainboard/emulation/spike-riscv/spike_util.c
@@ -32,187 +32,187 @@
#include <console/console.h>
uintptr_t translate_address(uintptr_t vAddr) {
- // TODO: implement the page table translation algorithm
- //uintptr_t pageTableRoot = read_csr(sptbr);
- uintptr_t physAddrMask = 0xfffffff;
- uintptr_t translationResult = vAddr & physAddrMask;
- printk(BIOS_DEBUG, "Translated virtual address 0x%llx to physical address 0x%llx\n", vAddr, translationResult);
- return translationResult;
+ // TODO: implement the page table translation algorithm
+ //uintptr_t pageTableRoot = read_csr(sptbr);
+ uintptr_t physAddrMask = 0xfffffff;
+ uintptr_t translationResult = vAddr & physAddrMask;
+ printk(BIOS_DEBUG, "Translated virtual address 0x%llx to physical address 0x%llx\n", vAddr, translationResult);
+ return translationResult;
}
uintptr_t mcall_query_memory(uintptr_t id, memory_block_info *p)
{
- uintptr_t physicalAddr = translate_address((uintptr_t) p);
- memory_block_info *info = (memory_block_info*) physicalAddr;
- if (id == 0) {
- info->base = 0x1000000; // hard coded for now, but we can put these values somewhere later
- info->size = 0x7F000000 - info->base;
- return 0;
- }
-
- return -1;
+ uintptr_t physicalAddr = translate_address((uintptr_t) p);
+ memory_block_info *info = (memory_block_info*) physicalAddr;
+ if (id == 0) {
+ info->base = 0x1000000; // hard coded for now, but we can put these values somewhere later
+ info->size = 0x7F000000 - info->base;
+ return 0;
+ }
+
+ return -1;
}
uintptr_t mcall_send_ipi(uintptr_t recipient)
{
- //if (recipient >= num_harts)
- //return -1;
+ //if (recipient >= num_harts)
+ //return -1;
- if (atomic_swap(&OTHER_HLS(recipient)->ipi_pending, 1) == 0) {
- mb();
- write_csr(send_ipi, recipient);
- }
+ if (atomic_swap(&OTHER_HLS(recipient)->ipi_pending, 1) == 0) {
+ mb();
+ write_csr(send_ipi, recipient);
+ }
- return 0;
+ return 0;
}
uintptr_t mcall_clear_ipi(void)
{
- // only clear SSIP if no other events are pending
- if (HLS()->device_response_queue_head == NULL) {
- clear_csr(mip, MIP_SSIP);
- mb();
- }
+ // only clear SSIP if no other events are pending
+ if (HLS()->device_response_queue_head == NULL) {
+ clear_csr(mip, MIP_SSIP);
+ mb();
+ }
- return atomic_swap(&HLS()->ipi_pending, 0);
+ return atomic_swap(&HLS()->ipi_pending, 0);
}
uintptr_t mcall_shutdown(void)
{
- while (1) write_csr(mtohost, 1);
- return 0;
+ while (1) write_csr(mtohost, 1);
+ return 0;
}
uintptr_t mcall_set_timer(unsigned long long when)
{
- write_csr(mtimecmp, when);
- clear_csr(mip, MIP_STIP);
- set_csr(mie, MIP_MTIP);
- return 0;
+ write_csr(mtimecmp, when);
+ clear_csr(mip, MIP_STIP);
+ set_csr(mie, MIP_MTIP);
+ return 0;
}
uintptr_t mcall_dev_req(sbi_device_message *m)
{
- if ((m->dev > 0xFFU) | (m->cmd > 0xFFU) | (m->data > 0x0000FFFFFFFFFFFFU)) return -EINVAL;
+ if ((m->dev > 0xFFU) | (m->cmd > 0xFFU) | (m->data > 0x0000FFFFFFFFFFFFU)) return -EINVAL;
- while (swap_csr(mtohost, TOHOST_CMD(m->dev, m->cmd, m->data)) != 0);
+ while (swap_csr(mtohost, TOHOST_CMD(m->dev, m->cmd, m->data)) != 0);
- m->sbi_private_data = (uintptr_t)HLS()->device_request_queue_head;
- HLS()->device_request_queue_head = m;
- HLS()->device_request_queue_size++;
+ m->sbi_private_data = (uintptr_t)HLS()->device_request_queue_head;
+ HLS()->device_request_queue_head = m;
+ HLS()->device_request_queue_size++;
- return 0;
+ return 0;
}
uintptr_t mcall_dev_resp(void)
{
- htif_interrupt(0, 0);
-
- sbi_device_message* m = HLS()->device_response_queue_head;
- if (m) {
- //printm("resp %p\n", m);
- sbi_device_message* next = (void*)atomic_read(&m->sbi_private_data);
- HLS()->device_response_queue_head = next;
- if (!next) {
- HLS()->device_response_queue_tail = 0;
-
- // only clear SSIP if no other events are pending
- clear_csr(mip, MIP_SSIP);
- mb();
- if (HLS()->ipi_pending) set_csr(mip, MIP_SSIP);
- }
- }
- return (uintptr_t)m;
+ htif_interrupt(0, 0);
+
+ sbi_device_message* m = HLS()->device_response_queue_head;
+ if (m) {
+ //printm("resp %p\n", m);
+ sbi_device_message* next = (void*)atomic_read(&m->sbi_private_data);
+ HLS()->device_response_queue_head = next;
+ if (!next) {
+ HLS()->device_response_queue_tail = 0;
+
+ // only clear SSIP if no other events are pending
+ clear_csr(mip, MIP_SSIP);
+ mb();
+ if (HLS()->ipi_pending) set_csr(mip, MIP_SSIP);
+ }
+ }
+ return (uintptr_t)m;
}
uintptr_t mcall_hart_id(void)
{
- return HLS()->hart_id;
+ return HLS()->hart_id;
}
void hls_init(uint32_t hart_id)
{
- memset(HLS(), 0, sizeof(*HLS()));
- HLS()->hart_id = hart_id;
+ memset(HLS(), 0, sizeof(*HLS()));
+ HLS()->hart_id = hart_id;
}
uintptr_t htif_interrupt(uintptr_t mcause, uintptr_t* regs) {
- uintptr_t fromhost = swap_csr(mfromhost, 0);
- if (!fromhost)
- return 0;
-
- uintptr_t dev = FROMHOST_DEV(fromhost);
- uintptr_t cmd = FROMHOST_CMD(fromhost);
- uintptr_t data = FROMHOST_DATA(fromhost);
-
- sbi_device_message* m = HLS()->device_request_queue_head;
- sbi_device_message* prev = 0x0;
- unsigned long i, n;
- for (i = 0, n = HLS()->device_request_queue_size; i < n; i++) {
- /*
- if (!supervisor_paddr_valid(m, sizeof(*m))
- && EXTRACT_FIELD(read_csr(mstatus), MSTATUS_PRV1) != PRV_M)
- panic("htif: page fault");
- */
-
- sbi_device_message* next = (void*)m->sbi_private_data;
- if (m->dev == dev && m->cmd == cmd) {
- m->data = data;
-
- // dequeue from request queue
- if (prev)
- prev->sbi_private_data = (uintptr_t)next;
- else
- HLS()->device_request_queue_head = next;
- HLS()->device_request_queue_size = n-1;
- m->sbi_private_data = 0;
-
- // enqueue to response queue
- if (HLS()->device_response_queue_tail)
- {
- HLS()->device_response_queue_tail->sbi_private_data = (uintptr_t)m;
- }
- else
- {
- HLS()->device_response_queue_head = m;
- }
- HLS()->device_response_queue_tail = m;
-
- // signal software interrupt
- set_csr(mip, MIP_SSIP);
- return 0;
- }
-
- prev = m;
- m = (void*)atomic_read(&m->sbi_private_data);
- }
- //HLT();
- return 0;
- //panic("htif: no record");
+ uintptr_t fromhost = swap_csr(mfromhost, 0);
+ if (!fromhost)
+ return 0;
+
+ uintptr_t dev = FROMHOST_DEV(fromhost);
+ uintptr_t cmd = FROMHOST_CMD(fromhost);
+ uintptr_t data = FROMHOST_DATA(fromhost);
+
+ sbi_device_message* m = HLS()->device_request_queue_head;
+ sbi_device_message* prev = 0x0;
+ unsigned long i, n;
+ for (i = 0, n = HLS()->device_request_queue_size; i < n; i++) {
+ /*
+ if (!supervisor_paddr_valid(m, sizeof(*m))
+ && EXTRACT_FIELD(read_csr(mstatus), MSTATUS_PRV1) != PRV_M)
+ panic("htif: page fault");
+ */
+
+ sbi_device_message* next = (void*)m->sbi_private_data;
+ if (m->dev == dev && m->cmd == cmd) {
+ m->data = data;
+
+ // dequeue from request queue
+ if (prev)
+ prev->sbi_private_data = (uintptr_t)next;
+ else
+ HLS()->device_request_queue_head = next;
+ HLS()->device_request_queue_size = n-1;
+ m->sbi_private_data = 0;
+
+ // enqueue to response queue
+ if (HLS()->device_response_queue_tail)
+ {
+ HLS()->device_response_queue_tail->sbi_private_data = (uintptr_t)m;
+ }
+ else
+ {
+ HLS()->device_response_queue_head = m;
+ }
+ HLS()->device_response_queue_tail = m;
+
+ // signal software interrupt
+ set_csr(mip, MIP_SSIP);
+ return 0;
+ }
+
+ prev = m;
+ m = (void*)atomic_read(&m->sbi_private_data);
+ }
+ //HLT();
+ return 0;
+ //panic("htif: no record");
}
uintptr_t mcall_console_putchar(uint8_t ch)
{
- while (swap_csr(mtohost, TOHOST_CMD(1, 1, ch)) != 0);
- while (1) {
- uintptr_t fromhost = read_csr(mfromhost);
- if (FROMHOST_DEV(fromhost) != 1 || FROMHOST_CMD(fromhost) != 1) {
- if (fromhost)
- htif_interrupt(0, 0);
- continue;
- }
- write_csr(mfromhost, 0);
- break;
- }
- return 0;
+ while (swap_csr(mtohost, TOHOST_CMD(1, 1, ch)) != 0);
+ while (1) {
+ uintptr_t fromhost = read_csr(mfromhost);
+ if (FROMHOST_DEV(fromhost) != 1 || FROMHOST_CMD(fromhost) != 1) {
+ if (fromhost)
+ htif_interrupt(0, 0);
+ continue;
+ }
+ write_csr(mfromhost, 0);
+ break;
+ }
+ return 0;
}
void testPrint(void) {
- /* Print a test command to check Spike console output */
- mcall_console_putchar('h');
- mcall_console_putchar('e');
- mcall_console_putchar('l');
- mcall_console_putchar('l');
- mcall_console_putchar('o');
- mcall_console_putchar('\n');
+ /* Print a test command to check Spike console output */
+ mcall_console_putchar('h');
+ mcall_console_putchar('e');
+ mcall_console_putchar('l');
+ mcall_console_putchar('l');
+ mcall_console_putchar('o');
+ mcall_console_putchar('\n');
}