mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-22 20:38:03 +00:00
uniphier: work around Boot ROM bug for USB boot mode of PXs3 SoC
Due to a bug in the Boot ROM, the USB load API turned out not working as expected. It is unfixable because the Boot ROM is hard-wired. Add work around code in TF to bypass the problematic Boot ROM code. Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
This commit is contained in:
parent
91be512846
commit
9bdccff462
1 changed files with 26 additions and 4 deletions
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
#define UNIPHIER_LD11_USB_DESC_BASE 0x30010000
|
#define UNIPHIER_LD11_USB_DESC_BASE 0x30010000
|
||||||
#define UNIPHIER_LD20_USB_DESC_BASE 0x30014000
|
#define UNIPHIER_LD20_USB_DESC_BASE 0x30014000
|
||||||
|
#define UNIPHIER_PXS3_USB_DESC_BASE 0x30014000
|
||||||
|
|
||||||
#define UNIPHIER_SRB_OCM_CONT 0x61200000
|
#define UNIPHIER_SRB_OCM_CONT 0x61200000
|
||||||
|
|
||||||
|
@ -41,6 +42,13 @@ struct uniphier_ld20_op {
|
||||||
void *dev_desc;
|
void *dev_desc;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct uniphier_pxs3_op {
|
||||||
|
uint8_t __pad[184];
|
||||||
|
struct uniphier_ld20_trans_op *trans_op;
|
||||||
|
void *__pad2;
|
||||||
|
void *dev_desc;
|
||||||
|
};
|
||||||
|
|
||||||
static int (*__uniphier_usb_read)(int lba, uintptr_t buf, size_t size);
|
static int (*__uniphier_usb_read)(int lba, uintptr_t buf, size_t size);
|
||||||
|
|
||||||
static void uniphier_ld11_usb_init(void)
|
static void uniphier_ld11_usb_init(void)
|
||||||
|
@ -91,14 +99,27 @@ static int uniphier_ld20_usb_read(int lba, uintptr_t buf, size_t size)
|
||||||
return ret ? 0 : -1;
|
return ret ? 0 : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void uniphier_pxs3_usb_init(void)
|
||||||
|
{
|
||||||
|
struct uniphier_pxs3_op *op = (void *)UNIPHIER_PXS3_USB_DESC_BASE;
|
||||||
|
|
||||||
|
op->trans_op = (void *)(op + 1);
|
||||||
|
|
||||||
|
op->dev_desc = op->trans_op + 1;
|
||||||
|
}
|
||||||
|
|
||||||
static int uniphier_pxs3_usb_read(int lba, uintptr_t buf, size_t size)
|
static int uniphier_pxs3_usb_read(int lba, uintptr_t buf, size_t size)
|
||||||
{
|
{
|
||||||
static int (*rom_usb_read)(unsigned int lba, unsigned int size,
|
static int (*rom_usb_read)(uintptr_t desc, unsigned int lba,
|
||||||
uintptr_t buf);
|
unsigned int size, uintptr_t buf);
|
||||||
|
int ret;
|
||||||
|
|
||||||
rom_usb_read = (__typeof(rom_usb_read))0x100c;
|
rom_usb_read = (__typeof(rom_usb_read))0x39e8;
|
||||||
|
|
||||||
return rom_usb_read(lba, size, buf);
|
/* ROM-API - return 1 on success, 0 on error */
|
||||||
|
ret = rom_usb_read(UNIPHIER_PXS3_USB_DESC_BASE, lba, size, buf);
|
||||||
|
|
||||||
|
return ret ? 0 : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct uniphier_usb_rom_param {
|
struct uniphier_usb_rom_param {
|
||||||
|
@ -116,6 +137,7 @@ static const struct uniphier_usb_rom_param uniphier_usb_rom_params[] = {
|
||||||
.read = uniphier_ld20_usb_read,
|
.read = uniphier_ld20_usb_read,
|
||||||
},
|
},
|
||||||
[UNIPHIER_SOC_PXS3] = {
|
[UNIPHIER_SOC_PXS3] = {
|
||||||
|
.init = uniphier_pxs3_usb_init,
|
||||||
.read = uniphier_pxs3_usb_read,
|
.read = uniphier_pxs3_usb_read,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue