Skip to content

Commit c124aa1

Browse files
committed
Refactor disk.c for generic use. Wired up uSD read for MBR/GPT
1 parent 2e8cd5f commit c124aa1

File tree

11 files changed

+246
-143
lines changed

11 files changed

+246
-143
lines changed

.github/workflows/test-build-riscv.yml

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,12 +81,21 @@ jobs:
8181
run: sudo apt-get update -o Acquire::Retries=3
8282

8383
- name: Download and install RISC-V toolchains
84+
if: ${{ inputs.arch == 'riscv' }}
8485
run: |
86+
# Download SiFive prebuilt toolchain with newlib
87+
wget -q https://static.dev.sifive.com/dev-tools/freedom-tools/v2020.12/riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14.tar.gz
88+
tar xzf riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14.tar.gz
89+
echo "$GITHUB_WORKSPACE/riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14/bin" >> $GITHUB_PATH
90+
8591
# Download latest prebuilt RISC-V toolchains
8692
#wget -q https://github.com/RISCV-Tools/riscv-gnu-toolchain/releases/latest/download/riscv32-elf-ubuntu-24.04-gcc.tar.xz
8793
#tar -xf riscv32-elf-ubuntu-24.04-gcc.tar.xz
8894
#echo "$GITHUB_WORKSPACE/riscv/bin" >> $GITHUB_PATH
8995
96+
- name: Download and install RISC-V toolchains
97+
if: ${{ inputs.arch == 'riscv64' }}
98+
run: |
9099
wget -q https://github.com/RISCV-Tools/riscv-gnu-toolchain/releases/latest/download/riscv64-elf-ubuntu-24.04-gcc.tar.xz
91100
tar -xf riscv64-elf-ubuntu-24.04-gcc.tar.xz
92101
echo "$GITHUB_WORKSPACE/riscv/bin" >> $GITHUB_PATH
@@ -106,7 +115,7 @@ jobs:
106115
- name: Build wolfboot (riscv32)
107116
if: ${{ inputs.arch == 'riscv' }}
108117
run: |
109-
# using riscv64 for now since riscv64-unknown-elf- is missing "zicsr" extension
118+
# using riscv64 for now since riscv32-unknown-elf- is missing "zicsr" extension
110119
make CROSS_COMPILE=riscv64-unknown-elf- FREEDOM_E_SDK=$GITHUB_WORKSPACE/freedom-e-sdk ${{inputs.make-args}}
111120
112121
- name: Build wolfboot (riscv64))

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,7 @@ line-count-nrf52:
528528
cloc --force-lang-def cloc_lang_def.txt src/boot_arm.c src/image.c src/libwolfboot.c src/loader.c src/update_flash.c hal/nrf52.c
529529

530530
line-count-x86:
531-
cloc --force-lang-def cloc_lang_def.txt src/boot_x86_fsp.c src/boot_x86_fsp_payload.c src/boot_x86_fsp_start.S src/image.c src/keystore.c src/libwolfboot.c src/loader.c src/string.c src/update_disk.c src/gpt.c src/x86/ahci.c src/x86/ata.c src/x86/common.c src/x86/disk.c src/x86/hob.c src/pci.c src/x86/tgl_fsp.c hal/x86_fsp_tgl.c hal/x86_uart.c
531+
cloc --force-lang-def cloc_lang_def.txt src/boot_x86_fsp.c src/boot_x86_fsp_payload.c src/boot_x86_fsp_start.S src/image.c src/keystore.c src/libwolfboot.c src/loader.c src/string.c src/update_disk.c src/gpt.c src/x86/ahci.c src/x86/ata.c src/x86/common.c src/disk.c src/x86/hob.c src/pci.c src/x86/tgl_fsp.c hal/x86_fsp_tgl.c hal/x86_uart.c
532532

533533
stack-usage: wolfboot.bin
534534
$(Q)echo $(STACK_USAGE) > .stack_usage

arch.mk

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -563,9 +563,10 @@ endif
563563
ifeq ($(ARCH),RISCV64)
564564
CROSS_COMPILE?=riscv64-unknown-elf-
565565
CFLAGS+=-DMMU -DWOLFBOOT_DUALBOOT
566-
CFLAGS+=-DWOLFBOOT_UPDATE_DISK
566+
CFLAGS+=-DWOLFBOOT_UPDATE_DISK -DMAX_DISKS=1
567567
UPDATE_OBJS:=src/update_disk.o
568568
OBJS += src/gpt.o
569+
OBJS += src/disk.o
569570
ARCH_FLAGS=-march=rv64imafd -mabi=lp64d -mcmodel=medany
570571
CFLAGS+=-fno-builtin-printf -DUSE_M_TIME -g -nostartfiles -DARCH_RISCV64
571572
CFLAGS+=$(ARCH_FLAGS)
@@ -1117,7 +1118,7 @@ ifeq ("${FSP}", "1")
11171118
OBJS += src/x86/ahci.o
11181119
OBJS += src/x86/ata.o
11191120
OBJS += src/gpt.o
1120-
OBJS += src/x86/disk.o
1121+
OBJS += src/disk.o
11211122
OBJS += src/x86/mptable.o
11221123
OBJS += src/stage2_params.o
11231124
OBJS += src/x86/exceptions.o

docs/Targets.md

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -879,10 +879,9 @@ set architecture riscv:rv64
879879
### PolarFire Example Boot Output
880880

881881
```
882-
wolfBoot Version: 2.7.0 (Dec 17 2025 11:59:22)
883-
disk_open: drv = 0
882+
wolfBoot Version: 2.7.0 (Dec 17 2025 14:51:25)
884883
mmc_set_timeout: timeout_val 500000 (12)
885-
mmc_set_clock: clock_khz: 400, freq_khz: 400
884+
mmc_set_clock: requested khz: 400, actual khz: 400
886885
mmc_send_cmd: cmd_index: 0, cmd_arg: 00000000, resp_type: 0
887886
mmc_send_cmd: cmd_index: 8, cmd_arg: 00000100, resp_type: 9
888887
mmc_init: xpc:0, si8r:1, max_ma (3.3v:128 1.8v:128)
@@ -908,18 +907,33 @@ mmc_send_cmd: cmd_index: 6, cmd_arg: 00000002, resp_type: 1
908907
mmc_send_cmd: cmd_index: 13, cmd_arg: AAAA0000, resp_type: 1
909908
mmc_send_cmd: cmd_index: 16, cmd_arg: 00000008, resp_type: 1
910909
mmc_send_cmd: cmd_index: 55, cmd_arg: AAAA0000, resp_type: 1
911-
mmc_block_read: cmd_index: 51, block_addr: 00000000, dst 0x801FFCE0, sz: 8
910+
mmc_read: cmd_index: 51, block_addr: 00000000, dst 0x801FFCE0, sz: 8
912911
mmc_send_cmd: cmd_index: 13, cmd_arg: AAAA0000, resp_type: 1
912+
mmc_read: status: 0
913913
mmc_send_cmd: cmd_index: 13, cmd_arg: AAAA0000, resp_type: 1
914-
mmc_block_read: cmd_index: 6, block_addr: 00000001, dst 0x801FFC48, sz: 64
914+
mmc_read: cmd_index: 6, block_addr: 00000001, dst 0x801FFC48, sz: 64
915915
mmc_send_cmd: cmd_index: 13, cmd_arg: AAAA0000, resp_type: 1
916+
mmc_read: status: 0
916917
mmc_send_cmd: cmd_index: 13, cmd_arg: AAAA0000, resp_type: 1
917-
mmc_block_read: cmd_index: 6, block_addr: 80000001, dst 0x801FFC48, sz: 64
918+
mmc_read: cmd_index: 6, block_addr: 80000001, dst 0x801FFC48, sz: 64
918919
mmc_send_cmd: cmd_index: 13, cmd_arg: AAAA0000, resp_type: 1
919-
mmc_set_clock: clock_khz: 50000, freq_khz: 50000
920-
Checking primary OS image in 0,1...
921-
Checking secondary OS image in 0,2...
922-
No valid OS image found in either partition 1 or 2
920+
mmc_read: status: 0
921+
mmc_set_clock: requested khz: 50000, actual khz: 50000
922+
Reading MBR...
923+
disk_read: drv:0, start:0, count:512, dst:0x801FF918
924+
mmc_send_cmd: cmd_index: 13, cmd_arg: AAAA0000, resp_type: 1
925+
mmc_read: cmd_index: 17, block_addr: 00000000, dst 0x801FF918, sz: 512
926+
mmc_send_cmd: cmd_index: 13, cmd_arg: AAAA0000, resp_type: 1
927+
mmc_read: status: 0
928+
Found GPT PTE at sector 1
929+
Found valid boot signature in MBR
930+
disk_read: drv:0, start:512, count:512, dst:0x801FF918
931+
mmc_send_cmd: cmd_index: 13, cmd_arg: AAAA0000, resp_type: 1
932+
mmc_read: cmd_index: 17, block_addr: 00000200, dst 0x801FF918, sz: 512
933+
mmc_send_cmd: cmd_index: 13, cmd_arg: AAAA0000, resp_type: 1
934+
mmc_read: status: 0
935+
Invalid partition table
936+
Error opening disk 0
923937
wolfBoot: PANIC!
924938
```
925939

hal/mpfs250.c

Lines changed: 62 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
#include <string.h>
3232
#include <stdbool.h>
3333

34-
#include <target.h>
34+
#include "target.h"
3535

3636
#include "mpfs250.h"
3737
#include "image.h"
@@ -42,6 +42,7 @@
4242
#include "printf.h"
4343
#include "loader.h"
4444
#include "disk.h"
45+
#include "gpt.h"
4546

4647
#define DEBUG_MMC
4748

@@ -200,6 +201,7 @@ int mmc_set_timeout(uint32_t timeout_us)
200201
return 0;
201202
}
202203

204+
/* TODO: Fix with real timer */
203205
void mmc_delay(uint32_t delay)
204206
{
205207
while (delay--) {
@@ -298,7 +300,7 @@ uint32_t mmc_set_clock(uint32_t clock_khz)
298300
last_clock_khz = clock_khz;
299301

300302
#ifdef DEBUG_MMC
301-
wolfBoot_printf("mmc_set_clock: clock_khz: %d, freq_khz: %d\n",
303+
wolfBoot_printf("mmc_set_clock: requested khz: %d, actual khz: %d\n",
302304
clock_khz, freq_khz);
303305
#endif
304306

@@ -453,8 +455,8 @@ int mmc_card_init(uint32_t acmd41_arg, uint32_t *ocr_reg)
453455
return status;
454456
}
455457

456-
/* MMC_CMD17_READ_SINGLE */
457-
int mmc_block_read(uint32_t cmd_index, uint32_t block_addr, uint32_t* dst,
458+
/* MMC_CMD17_READ_SINGLE, MMC_CMD18_READ_MULTIPLE */
459+
int mmc_read(uint32_t cmd_index, uint32_t block_addr, uint32_t* dst,
458460
uint32_t sz)
459461
{
460462
int status;
@@ -483,7 +485,7 @@ int mmc_block_read(uint32_t cmd_index, uint32_t block_addr, uint32_t* dst,
483485
}
484486

485487
#ifdef DEBUG_MMC
486-
wolfBoot_printf("mmc_block_read: cmd_index: %d, block_addr: %08X, dst %p, sz: %d\n",
488+
wolfBoot_printf("mmc_read: cmd_index: %d, block_addr: %08X, dst %p, sz: %d\n",
487489
cmd_index, block_addr, dst, sz);
488490
#endif
489491

@@ -513,12 +515,13 @@ int mmc_block_read(uint32_t cmd_index, uint32_t block_addr, uint32_t* dst,
513515
status = mmc_wait_busy(0);
514516
}
515517
else {
516-
#ifdef DEBUG_MMC
517-
wolfBoot_printf("mmc_block_read: error: 0x%08X\n", reg);
518-
#endif
519-
status = -1;
518+
status = -1; /* error */
520519
}
521520

521+
#ifdef DEBUG_MMC
522+
wolfBoot_printf("mmc_read: status: %d\n", status);
523+
#endif
524+
522525
return status;
523526
}
524527

@@ -567,10 +570,13 @@ static uint32_t get_srs_bits(int from, int count)
567570
return ret & mask;
568571
}
569572

570-
int mmc_send_switch_function(uint32_t mode, uint32_t function_number, uint32_t group_number)
573+
/* check or set switch function/group:
574+
* returns 0 if supported */
575+
int mmc_send_switch_function(uint32_t mode, uint32_t function_number,
576+
uint32_t group_number)
571577
{
572578
int status;
573-
uint32_t timeout = 4; /* up to 5 tries */
579+
uint32_t timeout = 4;
574580
uint32_t cmd_arg;
575581
uint32_t func_status[64/sizeof(uint32_t)]; /* fixed 512 bits */
576582
uint8_t* p_func_status = (uint8_t*)func_status;
@@ -582,7 +588,7 @@ int mmc_send_switch_function(uint32_t mode, uint32_t function_number, uint32_t g
582588
cmd_arg = (function_number << ((group_number - 1) * 4));
583589
do {
584590
/* first run check to see if function is supported */
585-
status = mmc_block_read(SD_CMD_6_SWITCH_FUNC,
591+
status = mmc_read(SD_CMD_6_SWITCH_FUNC,
586592
(mode | cmd_arg),
587593
func_status, sizeof(func_status));
588594
if (status == 0) {
@@ -600,11 +606,12 @@ int mmc_send_switch_function(uint32_t mode, uint32_t function_number, uint32_t g
600606
/* supported: group 1 415:400 */
601607
if ((p_func_status[13 -
602608
((group_number-1)*2)] & (1 << function_number))) {
603-
break; /* supported */
609+
status = 0; /* supported */
604610
}
605611
else {
606-
return -1; /* not supported */
612+
status = -1; /* not supported */
607613
}
614+
break;
608615
}
609616
} while (status == 0 && --timeout > 0); /* retry until function not busy */
610617
return status;
@@ -848,7 +855,7 @@ int mmc_init(void)
848855
if (status == 0) {
849856
/* Get SCR registers - 8 bytes */
850857
uint32_t scr_reg[SCR_REG_DATA_SIZE/sizeof(uint32_t)];
851-
status = mmc_block_read(SD_ACMD51_SEND_SCR, 0, scr_reg,
858+
status = mmc_read(SD_ACMD51_SEND_SCR, 0, scr_reg,
852859
sizeof(scr_reg));
853860
}
854861
if (status == 0) {
@@ -882,37 +889,58 @@ int mmc_init(void)
882889
return status;
883890
}
884891

885-
/* TODO: Add support for reading uSD card with GPT (Global Partition Table) */
886-
/* The partition ID's are determined using BOOT_PART_A and BOOT_PART_B. */
887-
int disk_open(int drv)
892+
/* returns number of bytes read on success or negative on error */
893+
int disk_read(int drv, uint64_t start, uint32_t count, uint32_t *buf)
888894
{
889-
wolfBoot_printf("disk_open: drv = %d\r\n", drv);
890-
(void)drv;
891-
return mmc_init();
895+
int status = 0;
896+
uint32_t read_sz;
897+
uint8_t* p_buf = (uint8_t*)buf;
898+
(void)drv; /* only one drive supported */
899+
900+
#ifdef DEBUG_MMC
901+
wolfBoot_printf("disk_read: drv:%d, start:%llu, count:%d, dst:%p\n",
902+
drv, start, count, buf);
903+
#endif
904+
905+
while (count > 0) {
906+
read_sz = count;
907+
if (read_sz > EMMC_SD_BLOCK_SIZE) {
908+
read_sz = EMMC_SD_BLOCK_SIZE;
909+
}
910+
status = mmc_read(MMC_CMD17_READ_SINGLE, start, (uint32_t*)p_buf, read_sz);
911+
if (status != 0) {
912+
return -1;
913+
}
914+
start += read_sz;
915+
p_buf += read_sz;
916+
count -= read_sz;
917+
}
918+
return status;
892919
}
893-
int disk_read(int drv, int part, uint64_t off, uint64_t sz, uint8_t *buf)
920+
921+
int disk_write(int drv, uint64_t start, uint32_t count, const uint32_t *buf)
894922
{
923+
/* not supported */
895924
(void)drv;
896-
(void)part;
897-
(void)off;
898-
(void)sz;
925+
(void)start;
926+
(void)count;
899927
(void)buf;
900928
return 0;
901929
}
902-
int disk_write(int drv, int part, uint64_t off, uint64_t sz, const uint8_t *buf)
930+
931+
int disk_init(int drv)
903932
{
933+
int r = mmc_init();
934+
if (r != 0) {
935+
wolfBoot_printf("Failed to initialize MMC\n");
936+
}
904937
(void)drv;
905-
(void)part;
906-
(void)off;
907-
(void)sz;
908-
(void)buf;
909-
return 0;
938+
return r;
910939
}
911-
int disk_find_partition_by_label(int drv, const char *label)
940+
941+
void disk_close(int drv)
912942
{
913943
(void)drv;
914-
(void)label;
915-
return 0;
916944
}
917945

918946
#ifdef DEBUG_UART

hal/mpfs250.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -877,6 +877,7 @@
877877

878878
#define SCR_REG_DATA_SIZE 8
879879

880+
880881
/* Switch Function Command Arguments */
881882
#define SDCARD_SWITCH_FUNC_MODE_SWITCH (0x1u << 31) /* Set function mode */
882883
#define SDCARD_SWITCH_FUNC_MODE_CHECK (0x0u << 31) /* Check mode */

hal/x86_fsp_tgl.c

Lines changed: 51 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,22 @@
1919
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
2020
*/
2121

22-
#include <wolfboot/wolfboot.h>
22+
#include "wolfboot/wolfboot.h"
2323
#include <stdint.h>
24-
#include <uart_drv.h>
25-
#include <printf.h>
26-
#include <x86/ahci.h>
27-
#include <x86/ata.h>
28-
#include <x86/common.h>
2924

3025
#ifdef __WOLFBOOT
3126

27+
#include "uart_drv.h"
28+
#include "printf.h"
29+
#include "loader.h"
30+
31+
#ifdef WOLFBOOT_FSP
32+
#include "x86/ahci.h"
33+
#include "x86/ata.h"
34+
#include "x86/common.h"
35+
#include "x86/tgl_fsp.h"
36+
#endif
37+
3238
#if defined(TARGET_kontron_vx3060_s2)
3339
#define PCI_AHCI_BUS 0
3440
#define PCI_AHCI_DEV 0x17
@@ -39,6 +45,45 @@
3945
#define PCI_AHCI_FUN 2
4046
#endif
4147

48+
#ifdef WOLFBOOT_FSP
49+
static uint32_t sata_bar;
50+
#endif
51+
52+
int disk_init(int drv)
53+
{
54+
int ret = 0;
55+
#ifdef WOLFBOOT_FSP
56+
ret = x86_fsp_tgl_init_sata(&sata_bar);
57+
if (ret != 0)
58+
wolfBoot_panic();
59+
#ifdef WOLFBOOT_ATA_DISK_LOCK
60+
ret = sata_unlock_disk(drv, 1);
61+
if (ret != 0)
62+
wolfBoot_panic();
63+
#endif
64+
#endif /* WOLFBOOT_FSP */
65+
(void)drv;
66+
return ret;
67+
}
68+
69+
void disk_close(int drv)
70+
{
71+
#ifdef WOLFBOOT_FSP
72+
sata_disable(sata_bar);
73+
#endif
74+
(void)drv;
75+
}
76+
77+
int disk_read(int drv, uint64_t start, uint32_t count, uint32_t *buf)
78+
{
79+
return ata_drive_read(drv, start, count, (uint8_t*)buf);
80+
}
81+
82+
int disk_write(int drv, uint64_t start, uint32_t count, const uint32_t *buf)
83+
{
84+
return ata_drive_write(drv, start, count, (const uint8_t*)buf);
85+
}
86+
4287
/*!
4388
* \brief Initializes the SATA controller.
4489
*

0 commit comments

Comments
 (0)