diff options
author | Alistair Francis <alistair.francis@wdc.com> | 2019-07-08 09:35:08 -0700 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2019-07-10 09:56:22 +0100 |
commit | 6085e491fba66708ee0e5bc1385c21845a3748ad (patch) | |
tree | 5d6889584abe30fcc8965eb192119430e397f2ca /meta | |
parent | 505c70357d8e354748c326c22c82677dd51fa57a (diff) | |
download | poky-6085e491fba66708ee0e5bc1385c21845a3748ad.tar.gz |
opensbi: Update from 0.3 to 0.4
The OpenSBI licence was updated to include contributors in the
copyright notice.
The payload logic has been updated to fix some bugs and handle the new
optional dependency on the Linux kernel for device trees
(From OE-Core rev: 76350b19945db458c60d3f233770543c00cb2067)
Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
-rw-r--r-- | meta/recipes-bsp/opensbi/files/0002-lib-Create-a-sbi_ipi_data-structure.patch | 128 | ||||
-rw-r--r-- | meta/recipes-bsp/opensbi/opensbi-payloads.inc | 22 | ||||
-rw-r--r-- | meta/recipes-bsp/opensbi/opensbi_0.4.bb (renamed from meta/recipes-bsp/opensbi/opensbi_0.3.bb) | 8 |
3 files changed, 17 insertions, 141 deletions
diff --git a/meta/recipes-bsp/opensbi/files/0002-lib-Create-a-sbi_ipi_data-structure.patch b/meta/recipes-bsp/opensbi/files/0002-lib-Create-a-sbi_ipi_data-structure.patch deleted file mode 100644 index 3c846bde62..0000000000 --- a/meta/recipes-bsp/opensbi/files/0002-lib-Create-a-sbi_ipi_data-structure.patch +++ /dev/null | |||
@@ -1,128 +0,0 @@ | |||
1 | From 508a27204cbbca0a9430236e56681e5e0d343fb9 Mon Sep 17 00:00:00 2001 | ||
2 | From: Alistair Francis <alistair.francis@wdc.com> | ||
3 | Date: Fri, 8 Mar 2019 11:22:22 -0800 | ||
4 | Subject: [PATCH] lib: Create a sbi_ipi_data structure | ||
5 | |||
6 | Create a sbi_ipi_data structure that holds unpacked IPI information. At | ||
7 | the same time remove ipi_type from the sbi_scratch struct and use a | ||
8 | fixed offset to access it. | ||
9 | |||
10 | This structure fits in behind the sbi_scratch structure. | ||
11 | |||
12 | This fixes https://github.com/riscv/opensbi/issues/81 | ||
13 | |||
14 | Upstream-Status: Backport [https://github.com/riscv/opensbi/commit/508a27204cbbca0a9430236e56681e5e0d343fb9] | ||
15 | Signed-off-by: Alistair Francis <alistair.francis@wdc.com> | ||
16 | --- | ||
17 | firmware/fw_base.S | 1 - | ||
18 | include/sbi/sbi_scratch.h | 23 ++++++++++++++++------- | ||
19 | lib/sbi_ipi.c | 8 +++++--- | ||
20 | 3 files changed, 21 insertions(+), 11 deletions(-) | ||
21 | |||
22 | diff --git a/firmware/fw_base.S b/firmware/fw_base.S | ||
23 | index cf2c6a0..69cfc90 100644 | ||
24 | --- a/firmware/fw_base.S | ||
25 | +++ b/firmware/fw_base.S | ||
26 | @@ -183,7 +183,6 @@ _start_warm: | ||
27 | REG_S a4, SBI_SCRATCH_PLATFORM_ADDR_OFFSET(tp) | ||
28 | la a4, _hartid_to_scratch | ||
29 | REG_S a4, SBI_SCRATCH_HARTID_TO_SCRATCH_OFFSET(tp) | ||
30 | - REG_S zero, SBI_SCRATCH_IPI_TYPE_OFFSET(tp) | ||
31 | REG_S zero, SBI_SCRATCH_TMP0_OFFSET(tp) | ||
32 | |||
33 | /* Setup stack */ | ||
34 | diff --git a/include/sbi/sbi_scratch.h b/include/sbi/sbi_scratch.h | ||
35 | index 8389ef3..70ab384 100644 | ||
36 | --- a/include/sbi/sbi_scratch.h | ||
37 | +++ b/include/sbi/sbi_scratch.h | ||
38 | @@ -28,17 +28,24 @@ | ||
39 | #define SBI_SCRATCH_PLATFORM_ADDR_OFFSET (6 * __SIZEOF_POINTER__) | ||
40 | /** Offset of hartid_to_scratch member in sbi_scratch */ | ||
41 | #define SBI_SCRATCH_HARTID_TO_SCRATCH_OFFSET (7 * __SIZEOF_POINTER__) | ||
42 | -/** Offset of ipi_type member in sbi_scratch */ | ||
43 | -#define SBI_SCRATCH_IPI_TYPE_OFFSET (8 * __SIZEOF_POINTER__) | ||
44 | /** Offset of tmp0 member in sbi_scratch */ | ||
45 | -#define SBI_SCRATCH_TMP0_OFFSET (9 * __SIZEOF_POINTER__) | ||
46 | -/** Maximum size of sbi_scratch */ | ||
47 | -#define SBI_SCRATCH_SIZE 256 | ||
48 | +#define SBI_SCRATCH_TMP0_OFFSET (8 * __SIZEOF_POINTER__) | ||
49 | + | ||
50 | +/** sbi_ipi_data is located behind sbi_scratch. This struct is not packed. */ | ||
51 | +/** Offset of ipi_type in sbi_ipi_data */ | ||
52 | +#define SBI_IPI_DATA_IPI_TYPE_OFFSET (15 * __SIZEOF_POINTER__) | ||
53 | + | ||
54 | +/** Maximum size of sbi_scratch and sbi_ipi_data */ | ||
55 | +#define SBI_SCRATCH_SIZE (32 * __SIZEOF_POINTER__) | ||
56 | |||
57 | #ifndef __ASSEMBLY__ | ||
58 | |||
59 | #include <sbi/sbi_types.h> | ||
60 | |||
61 | +struct sbi_ipi_data { | ||
62 | + unsigned long ipi_type; | ||
63 | +}; | ||
64 | + | ||
65 | /** Representation of per-HART scratch space */ | ||
66 | struct sbi_scratch { | ||
67 | /** Start (or base) address of firmware linked to OpenSBI library */ | ||
68 | @@ -57,8 +64,6 @@ struct sbi_scratch { | ||
69 | unsigned long platform_addr; | ||
70 | /** Address of HART ID to sbi_scratch conversion function */ | ||
71 | unsigned long hartid_to_scratch; | ||
72 | - /** IPI type (or flags) */ | ||
73 | - unsigned long ipi_type; | ||
74 | /** Temporary storage */ | ||
75 | unsigned long tmp0; | ||
76 | } __packed; | ||
77 | @@ -71,6 +76,10 @@ struct sbi_scratch { | ||
78 | #define sbi_scratch_thishart_arg1_ptr() \ | ||
79 | ((void *)(sbi_scratch_thishart_ptr()->next_arg1)) | ||
80 | |||
81 | +/** Get pointer to sbi_ipi_data from sbi_scratch */ | ||
82 | +#define sbi_ipi_data_ptr(scratch) \ | ||
83 | +((struct sbi_ipi_data *)(void*)scratch + SBI_IPI_DATA_IPI_TYPE_OFFSET) | ||
84 | + | ||
85 | #endif | ||
86 | |||
87 | #endif | ||
88 | diff --git a/lib/sbi_ipi.c b/lib/sbi_ipi.c | ||
89 | index 0e371d7..e0f2a19 100644 | ||
90 | --- a/lib/sbi_ipi.c | ||
91 | +++ b/lib/sbi_ipi.c | ||
92 | @@ -31,7 +31,7 @@ static int sbi_ipi_send(struct sbi_scratch *scratch, u32 hartid, u32 event) | ||
93 | * trigger the interrupt | ||
94 | */ | ||
95 | remote_scratch = sbi_hart_id_to_scratch(scratch, hartid); | ||
96 | - atomic_raw_set_bit(event, &remote_scratch->ipi_type); | ||
97 | + atomic_raw_set_bit(event, &sbi_ipi_data_ptr(remote_scratch)->ipi_type); | ||
98 | mb(); | ||
99 | sbi_platform_ipi_send(plat, hartid); | ||
100 | if (event != SBI_IPI_EVENT_SOFT) | ||
101 | @@ -80,7 +80,7 @@ void sbi_ipi_process(struct sbi_scratch *scratch) | ||
102 | sbi_platform_ipi_clear(plat, hartid); | ||
103 | |||
104 | do { | ||
105 | - ipi_type = scratch->ipi_type; | ||
106 | + ipi_type = sbi_ipi_data_ptr(scratch)->ipi_type; | ||
107 | rmb(); | ||
108 | ipi_event = __ffs(ipi_type); | ||
109 | switch (ipi_event) { | ||
110 | @@ -97,12 +97,14 @@ void sbi_ipi_process(struct sbi_scratch *scratch) | ||
111 | sbi_hart_hang(); | ||
112 | break; | ||
113 | }; | ||
114 | - ipi_type = atomic_raw_clear_bit(ipi_event, &scratch->ipi_type); | ||
115 | + ipi_type = atomic_raw_clear_bit(ipi_event, &sbi_ipi_data_ptr(scratch)->ipi_type); | ||
116 | } while(ipi_type > 0); | ||
117 | } | ||
118 | |||
119 | int sbi_ipi_init(struct sbi_scratch *scratch, bool cold_boot) | ||
120 | { | ||
121 | + sbi_ipi_data_ptr(scratch)->ipi_type = 0x00; | ||
122 | + | ||
123 | /* Enable software interrupts */ | ||
124 | csr_set(CSR_MIE, MIP_MSIP); | ||
125 | |||
126 | -- | ||
127 | 2.22.0 | ||
128 | |||
diff --git a/meta/recipes-bsp/opensbi/opensbi-payloads.inc b/meta/recipes-bsp/opensbi/opensbi-payloads.inc index 7828599ce4..b9714a7acb 100644 --- a/meta/recipes-bsp/opensbi/opensbi-payloads.inc +++ b/meta/recipes-bsp/opensbi/opensbi-payloads.inc | |||
@@ -5,10 +5,7 @@ def riscv_get_extra_oemake_image(d): | |||
5 | if sbi_payload is None: | 5 | if sbi_payload is None: |
6 | return "" | 6 | return "" |
7 | 7 | ||
8 | if d.getVar('RISCV_SBI_PAYLOAD'): | 8 | return "FW_PAYLOAD_PATH=" + deploy_dir + "/" + sbi_payload |
9 | return "FW_PAYLOAD_PATH=" + deploy_dir + "/" + sbi_payload | ||
10 | |||
11 | return "" | ||
12 | 9 | ||
13 | def riscv_get_extra_oemake_fdt(d): | 10 | def riscv_get_extra_oemake_fdt(d): |
14 | sbi_fdt_payload = d.getVar('RISCV_SBI_FDT') | 11 | sbi_fdt_payload = d.getVar('RISCV_SBI_FDT') |
@@ -17,14 +14,11 @@ def riscv_get_extra_oemake_fdt(d): | |||
17 | if sbi_fdt_payload is None: | 14 | if sbi_fdt_payload is None: |
18 | return "" | 15 | return "" |
19 | 16 | ||
20 | if d.getVar('RISCV_SBI_PAYLOAD'): | 17 | return "FW_PAYLOAD_FDT_PATH=" + deploy_dir + "/" + sbi_fdt_payload |
21 | # This is internal to openSBI, not a full path | ||
22 | return "FW_PAYLOAD_FDT=" + sbi_fdt_payload | ||
23 | |||
24 | return "" | ||
25 | 18 | ||
26 | def riscv_get_do_compile_depends(d): | 19 | def riscv_get_do_compile_depends(d): |
27 | sbi_payload = d.getVar('RISCV_SBI_PAYLOAD') | 20 | sbi_payload = d.getVar('RISCV_SBI_PAYLOAD') |
21 | sbi_fdt_payload = d.getVar('RISCV_SBI_FDT') | ||
28 | 22 | ||
29 | if sbi_payload is None: | 23 | if sbi_payload is None: |
30 | return "" | 24 | return "" |
@@ -32,6 +26,14 @@ def riscv_get_do_compile_depends(d): | |||
32 | if 'linux' in sbi_payload or 'Image' in sbi_payload: | 26 | if 'linux' in sbi_payload or 'Image' in sbi_payload: |
33 | return "virtual/kernel:do_deploy" | 27 | return "virtual/kernel:do_deploy" |
34 | if 'u-boot.bin' in sbi_payload: | 28 | if 'u-boot.bin' in sbi_payload: |
35 | return "virtual/bootloader:do_deploy" | 29 | # If we want U-Boot and a FDT then we need to depend on U-Boot and |
30 | # the kernel | ||
31 | if sbi_fdt_payload is not None: | ||
32 | return "virtual/bootloader:do_deploy virtual/kernel:do_deploy" | ||
33 | else: | ||
34 | return "virtual/bootloader:do_deploy" | ||
35 | # If we want a custom FDT then we need to depend on the kernel | ||
36 | if sbi_fdt_payload is not None: | ||
37 | return "virtual/kernel:do_deploy" | ||
36 | 38 | ||
37 | return "" | 39 | return "" |
diff --git a/meta/recipes-bsp/opensbi/opensbi_0.3.bb b/meta/recipes-bsp/opensbi/opensbi_0.4.bb index 2b4fb97df2..139718c72b 100644 --- a/meta/recipes-bsp/opensbi/opensbi_0.3.bb +++ b/meta/recipes-bsp/opensbi/opensbi_0.4.bb | |||
@@ -1,17 +1,16 @@ | |||
1 | SUMMARY = "RISC-V Open Source Supervisor Binary Interface (OpenSBI)" | 1 | SUMMARY = "RISC-V Open Source Supervisor Binary Interface (OpenSBI)" |
2 | DESCRIPTION = "OpenSBI aims to provide an open-source and extensible implementation of the RISC-V SBI specification for a platform specific firmware (M-mode) and a general purpose OS, hypervisor or bootloader (S-mode or HS-mode). OpenSBI implementation can be easily extended by RISC-V platform or System-on-Chip vendors to fit a particular hadware configuration." | 2 | DESCRIPTION = "OpenSBI aims to provide an open-source and extensible implementation of the RISC-V SBI specification for a platform specific firmware (M-mode) and a general purpose OS, hypervisor or bootloader (S-mode or HS-mode). OpenSBI implementation can be easily extended by RISC-V platform or System-on-Chip vendors to fit a particular hadware configuration." |
3 | LICENSE = "BSD-2-Clause" | 3 | LICENSE = "BSD-2-Clause" |
4 | LIC_FILES_CHKSUM = "file://COPYING.BSD;md5=c36118b4f615f9da37635f2a7ac8ccaf" | 4 | LIC_FILES_CHKSUM = "file://COPYING.BSD;md5=42dd9555eb177f35150cf9aa240b61e5" |
5 | DEPENDS += "dtc-native" | 5 | DEPENDS += "dtc-native" |
6 | 6 | ||
7 | require opensbi-payloads.inc | 7 | require opensbi-payloads.inc |
8 | 8 | ||
9 | inherit autotools-brokensep | 9 | inherit autotools-brokensep |
10 | 10 | ||
11 | SRCREV = "ca20ac0cd4c099006d4eea4d9ac7bd7b58e2ae0f" | 11 | SRCREV = "ce228ee0919deb9957192d723eecc8aaae2697c6" |
12 | SRC_URI = "git://github.com/riscv/opensbi.git \ | 12 | SRC_URI = "git://github.com/riscv/opensbi.git \ |
13 | file://0001-Makefile-Don-t-specify-mabi-or-march.patch \ | 13 | file://0001-Makefile-Don-t-specify-mabi-or-march.patch \ |
14 | file://0002-lib-Create-a-sbi_ipi_data-structure.patch \ | ||
15 | " | 14 | " |
16 | 15 | ||
17 | S = "${WORKDIR}/git" | 16 | S = "${WORKDIR}/git" |
@@ -38,12 +37,15 @@ do_deploy () { | |||
38 | install -d ${DEPLOY_DIR_IMAGE} | 37 | install -d ${DEPLOY_DIR_IMAGE} |
39 | install -m 755 ${D}/platform/${RISCV_SBI_PLAT}/firmware/fw_payload.* ${DEPLOY_DIR_IMAGE}/ | 38 | install -m 755 ${D}/platform/${RISCV_SBI_PLAT}/firmware/fw_payload.* ${DEPLOY_DIR_IMAGE}/ |
40 | install -m 755 ${D}/platform/${RISCV_SBI_PLAT}/firmware/fw_jump.* ${DEPLOY_DIR_IMAGE}/ | 39 | install -m 755 ${D}/platform/${RISCV_SBI_PLAT}/firmware/fw_jump.* ${DEPLOY_DIR_IMAGE}/ |
40 | install -m 755 ${D}/platform/${RISCV_SBI_PLAT}/firmware/fw_dynamic.* ${DEPLOY_DIR_IMAGE}/ | ||
41 | } | 41 | } |
42 | 42 | ||
43 | addtask deploy after do_install | 43 | addtask deploy after do_install |
44 | 44 | ||
45 | FILES_${PN} += "/platform/${RISCV_SBI_PLAT}/firmware/fw_jump.*" | 45 | FILES_${PN} += "/platform/${RISCV_SBI_PLAT}/firmware/fw_jump.*" |
46 | FILES_${PN} += "/platform/${RISCV_SBI_PLAT}/firmware/fw_payload.*" | 46 | FILES_${PN} += "/platform/${RISCV_SBI_PLAT}/firmware/fw_payload.*" |
47 | FILES_${PN} += "/platform/${RISCV_SBI_PLAT}/firmware/fw_dynamic.*" | ||
48 | |||
47 | 49 | ||
48 | COMPATIBLE_HOST = "(riscv64|riscv32).*" | 50 | COMPATIBLE_HOST = "(riscv64|riscv32).*" |
49 | INHIBIT_PACKAGE_STRIP = "1" | 51 | INHIBIT_PACKAGE_STRIP = "1" |