uniphier: work around Boot ROM bug for USB boot mode of PXs3 SoC
authorMasahiro Yamada <yamada.masahiro@socionext.com>
Thu, 31 Aug 2017 07:30:47 +0000 (16:30 +0900)
committerMasahiro Yamada <yamada.masahiro@socionext.com>
Fri, 1 Sep 2017 02:11:30 +0000 (11:11 +0900)
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>
plat/socionext/uniphier/uniphier_usb.c

index 49ca8e5096f74fab55d5e8bd4cdda322a9087dbf..4be0e908c4dc5a93c73fe52911e57e4b92ccb535 100644 (file)
@@ -16,6 +16,7 @@
 
 #define UNIPHIER_LD11_USB_DESC_BASE    0x30010000
 #define UNIPHIER_LD20_USB_DESC_BASE    0x30014000
+#define UNIPHIER_PXS3_USB_DESC_BASE    0x30014000
 
 #define UNIPHIER_SRB_OCM_CONT          0x61200000
 
@@ -41,6 +42,13 @@ struct uniphier_ld20_op {
        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 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;
 }
 
+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 (*rom_usb_read)(unsigned int lba, unsigned int size,
-                                  uintptr_t buf);
+       static int (*rom_usb_read)(uintptr_t desc, unsigned int lba,
+                                  unsigned int size, uintptr_t buf);
+       int ret;
+
+       rom_usb_read = (__typeof(rom_usb_read))0x39e8;
 
-       rom_usb_read = (__typeof(rom_usb_read))0x100c;
+       /* ROM-API - return 1 on success, 0 on error */
+       ret = rom_usb_read(UNIPHIER_PXS3_USB_DESC_BASE, lba, size, buf);
 
-       return rom_usb_read(lba, size, buf);
+       return ret ? 0 : -1;
 }
 
 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,
        },
        [UNIPHIER_SOC_PXS3] = {
+               .init = uniphier_pxs3_usb_init,
                .read = uniphier_pxs3_usb_read,
        },
 };