Commit 62daa36f authored by Bernhard Nortmann's avatar Bernhard Nortmann
Browse files

fel_lib: Provide BROM version and SoC information via device handle



The feldev_handle struct returned by feldev_open() will now contain
this additional data, so the main application no longer needs to care
about retrieving that.

aw_fel_get_version() has thus become a static (= 'private') function.
Signed-off-by: default avatarBernhard Nortmann <bernhard.nortmann@web.de>
parent 36978e3e
...@@ -85,8 +85,7 @@ int get_image_type(const uint8_t *buf, size_t len) ...@@ -85,8 +85,7 @@ int get_image_type(const uint8_t *buf, size_t len)
void aw_fel_print_version(feldev_handle *dev) void aw_fel_print_version(feldev_handle *dev)
{ {
struct aw_fel_version buf; struct aw_fel_version buf = dev->soc_version;
aw_fel_get_version(dev, &buf);
const char *soc_name="unknown"; const char *soc_name="unknown";
switch (buf.soc_id) { switch (buf.soc_id) {
...@@ -236,19 +235,6 @@ void aw_fel_fill(feldev_handle *dev, uint32_t offset, size_t size, unsigned char ...@@ -236,19 +235,6 @@ void aw_fel_fill(feldev_handle *dev, uint32_t offset, size_t size, unsigned char
aw_write_buffer(dev, buf, offset, size, false); aw_write_buffer(dev, buf, offset, size, false);
} }
soc_info_t *aw_fel_get_soc_info(feldev_handle *dev)
{
/* persistent SoC info, retrieves result pointer once and caches it */
static soc_info_t *result = NULL;
if (result == NULL) {
struct aw_fel_version buf;
aw_fel_get_version(dev, &buf);
result = get_soc_info_from_version(&buf);
}
return result;
}
static uint32_t fel_to_spl_thunk[] = { static uint32_t fel_to_spl_thunk[] = {
#include "fel-to-spl-thunk.h" #include "fel-to-spl-thunk.h"
}; };
...@@ -320,7 +306,7 @@ void aw_fel_readl_n(feldev_handle *dev, uint32_t addr, ...@@ -320,7 +306,7 @@ void aw_fel_readl_n(feldev_handle *dev, uint32_t addr,
"ERROR: Max. word count exceeded, truncating aw_fel_readl_n() transfer\n"); "ERROR: Max. word count exceeded, truncating aw_fel_readl_n() transfer\n");
count = LCODE_MAX_WORDS; count = LCODE_MAX_WORDS;
} }
soc_info_t *soc_info = aw_fel_get_soc_info(dev); soc_info_t *soc_info = dev->soc_info;
assert(LCODE_MAX_WORDS < 256); /* protect against corruption of ARM code */ assert(LCODE_MAX_WORDS < 256); /* protect against corruption of ARM code */
uint32_t arm_code[] = { uint32_t arm_code[] = {
...@@ -387,7 +373,7 @@ void aw_fel_writel_n(feldev_handle *dev, uint32_t addr, ...@@ -387,7 +373,7 @@ void aw_fel_writel_n(feldev_handle *dev, uint32_t addr,
"ERROR: Max. word count exceeded, truncating aw_fel_writel_n() transfer\n"); "ERROR: Max. word count exceeded, truncating aw_fel_writel_n() transfer\n");
count = LCODE_MAX_WORDS; count = LCODE_MAX_WORDS;
} }
soc_info_t *soc_info = aw_fel_get_soc_info(dev); soc_info_t *soc_info = dev->soc_info;
assert(LCODE_MAX_WORDS < 256); /* protect against corruption of ARM code */ assert(LCODE_MAX_WORDS < 256); /* protect against corruption of ARM code */
/* /*
...@@ -445,7 +431,7 @@ void fel_writel_n(feldev_handle *dev, uint32_t addr, uint32_t *src, size_t count ...@@ -445,7 +431,7 @@ void fel_writel_n(feldev_handle *dev, uint32_t addr, uint32_t *src, size_t count
void aw_fel_print_sid(feldev_handle *dev) void aw_fel_print_sid(feldev_handle *dev)
{ {
soc_info_t *soc_info = aw_fel_get_soc_info(dev); soc_info_t *soc_info = dev->soc_info;
if (soc_info->sid_addr) { if (soc_info->sid_addr) {
pr_info("SID key (e-fuses) at 0x%08X\n", soc_info->sid_addr); pr_info("SID key (e-fuses) at 0x%08X\n", soc_info->sid_addr);
...@@ -731,7 +717,7 @@ void aw_restore_and_enable_mmu(feldev_handle *dev, ...@@ -731,7 +717,7 @@ void aw_restore_and_enable_mmu(feldev_handle *dev,
void aw_fel_write_and_execute_spl(feldev_handle *dev, uint8_t *buf, size_t len) void aw_fel_write_and_execute_spl(feldev_handle *dev, uint8_t *buf, size_t len)
{ {
soc_info_t *soc_info = aw_fel_get_soc_info(dev); soc_info_t *soc_info = dev->soc_info;
sram_swap_buffers *swap_buffers; sram_swap_buffers *swap_buffers;
char header_signature[9] = { 0 }; char header_signature[9] = { 0 };
size_t i, thunk_size; size_t i, thunk_size;
...@@ -1007,7 +993,7 @@ bool have_sunxi_spl(feldev_handle *dev, uint32_t spl_addr) ...@@ -1007,7 +993,7 @@ bool have_sunxi_spl(feldev_handle *dev, uint32_t spl_addr)
void pass_fel_information(feldev_handle *dev, void pass_fel_information(feldev_handle *dev,
uint32_t script_address, uint32_t uEnv_length) uint32_t script_address, uint32_t uEnv_length)
{ {
soc_info_t *soc_info = aw_fel_get_soc_info(dev); soc_info_t *soc_info = dev->soc_info;
/* write something _only_ if we have a suitable SPL header */ /* write something _only_ if we have a suitable SPL header */
if (have_sunxi_spl(dev, soc_info->spl_addr)) { if (have_sunxi_spl(dev, soc_info->spl_addr)) {
...@@ -1034,7 +1020,7 @@ void pass_fel_information(feldev_handle *dev, ...@@ -1034,7 +1020,7 @@ void pass_fel_information(feldev_handle *dev,
*/ */
void aw_rmr_request(feldev_handle *dev, uint32_t entry_point, bool aarch64) void aw_rmr_request(feldev_handle *dev, uint32_t entry_point, bool aarch64)
{ {
soc_info_t *soc_info = aw_fel_get_soc_info(dev); soc_info_t *soc_info = dev->soc_info;
if (!soc_info->rvbar_reg) { if (!soc_info->rvbar_reg) {
fprintf(stderr, "ERROR: Can't issue RMR request!\n" fprintf(stderr, "ERROR: Can't issue RMR request!\n"
"RVBAR is not supported or unknown for your SoC (id=%04X).\n", "RVBAR is not supported or unknown for your SoC (id=%04X).\n",
......
...@@ -191,7 +191,7 @@ void aw_read_fel_status(feldev_handle *dev) ...@@ -191,7 +191,7 @@ void aw_read_fel_status(feldev_handle *dev)
} }
/* AW_FEL_VERSION request */ /* AW_FEL_VERSION request */
void aw_fel_get_version(feldev_handle *dev, struct aw_fel_version *buf) static void aw_fel_get_version(feldev_handle *dev, struct aw_fel_version *buf)
{ {
aw_send_fel_request(dev, AW_FEL_VERSION, 0, 0); aw_send_fel_request(dev, AW_FEL_VERSION, 0, 0);
aw_usb_read(dev, buf, sizeof(*buf)); aw_usb_read(dev, buf, sizeof(*buf));
...@@ -387,6 +387,10 @@ feldev_handle *feldev_open(int busnum, int devnum, ...@@ -387,6 +387,10 @@ feldev_handle *feldev_open(int busnum, int devnum,
feldev_claim(result); /* claim interface, detect USB endpoints */ feldev_claim(result); /* claim interface, detect USB endpoints */
/* retrieve BROM version and SoC information */
aw_fel_get_version(result, &result->soc_version);
result->soc_info = get_soc_info_from_version(&result->soc_version);
return result; return result;
} }
......
...@@ -28,9 +28,11 @@ ...@@ -28,9 +28,11 @@
typedef struct _felusb_handle felusb_handle; /* opaque data type */ typedef struct _felusb_handle felusb_handle; /* opaque data type */
/* More general FEL "device" handle, to be extended later */ /* More general FEL "device" handle, including version data and SoC info */
typedef struct { typedef struct {
felusb_handle *usb; felusb_handle *usb;
struct aw_fel_version soc_version;
soc_info_t *soc_info;
} feldev_handle; } feldev_handle;
/* FEL device management */ /* FEL device management */
...@@ -44,7 +46,6 @@ void feldev_close(feldev_handle *dev); ...@@ -44,7 +46,6 @@ void feldev_close(feldev_handle *dev);
/* FEL functions */ /* FEL functions */
void aw_fel_get_version(feldev_handle *dev, struct aw_fel_version *buf);
void aw_fel_read(feldev_handle *dev, uint32_t offset, void *buf, size_t len); void aw_fel_read(feldev_handle *dev, uint32_t offset, void *buf, size_t len);
void aw_fel_write(feldev_handle *dev, void *buf, uint32_t offset, size_t len); void aw_fel_write(feldev_handle *dev, void *buf, uint32_t offset, size_t len);
void aw_fel_write_buffer(feldev_handle *dev, void *buf, uint32_t offset, void aw_fel_write_buffer(feldev_handle *dev, void *buf, uint32_t offset,
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment