]> git.kernelconcepts.de Git - karo-tx-uboot.git/commitdiff
Merge git://git.denx.de/u-boot-dm
authorTom Rini <trini@konsulko.com>
Fri, 27 May 2016 19:49:43 +0000 (15:49 -0400)
committerTom Rini <trini@konsulko.com>
Sat, 28 May 2016 00:34:12 +0000 (20:34 -0400)
For odroid-c2 (arch-meson) for now disable designware eth as meson
now needs to do some harder GPIO work.

Signed-off-by: Tom Rini <trini@konsulko.com>
Conflicts:
lib/efi_loader/efi_disk.c

Modified:
configs/odroid-c2_defconfig

1  2 
common/spl/spl_mmc.c
configs/odroid-c2_defconfig
drivers/clk/clk_rk3288.c
include/efi_loader.h
lib/efi_loader/efi_disk.c

diff --combined common/spl/spl_mmc.c
index d8058d63999657c2d73b68e13ffd7776a518655f,6adfc9b8e5a9bf504ce179fbdacdd7ed37f8bd57..ef8583a1a64981ccdf44423b9bf257c4b117d5c5
@@@ -34,9 -34,8 +34,8 @@@ static int mmc_load_legacy(struct mmc *
                             mmc->read_bl_len;
  
        /* Read the header too to avoid extra memcpy */
-       count = mmc->block_dev.block_read(&mmc->block_dev, sector,
-                                         image_size_sectors,
-                                         (void *)(ulong)spl_image.load_addr);
+       count = blk_dread(mmc_get_blk_desc(mmc), sector, image_size_sectors,
+                         (void *)(ulong)spl_image.load_addr);
        debug("read %x sectors to %x\n", image_size_sectors,
              spl_image.load_addr);
        if (count != image_size_sectors)
@@@ -50,7 -49,7 +49,7 @@@ static ulong h_spl_load_read(struct spl
  {
        struct mmc *mmc = load->dev;
  
-       return mmc->block_dev.block_read(&mmc->block_dev, sector, count, buf);
+       return blk_dread(mmc_get_blk_desc(mmc), sector, count, buf);
  }
  
  static int mmc_load_image_raw_sector(struct mmc *mmc, unsigned long sector)
@@@ -63,7 -62,7 +62,7 @@@
                                         sizeof(struct image_header));
  
        /* read image header to find the image size & load address */
-       count = mmc->block_dev.block_read(&mmc->block_dev, sector, 1, header);
+       count = blk_dread(mmc_get_blk_desc(mmc), sector, 1, header);
        debug("hdr read sector %lx, count=%lu\n", sector, count);
        if (count == 0) {
                ret = -EIO;
@@@ -77,7 -76,6 +76,7 @@@
                debug("Found FIT\n");
                load.dev = mmc;
                load.priv = NULL;
 +              load.filename = NULL;
                load.bl_len = mmc->read_bl_len;
                load.read = h_spl_load_read;
                ret = spl_load_simple_fit(&load, sector, header);
index a771b20f5fbb75f696d92107ef21e4ca23113609,0000000000000000000000000000000000000000..483d4900b78ae512929a171be02a34c9d252e62f
mode 100644,000000..100644
--- /dev/null
@@@ -1,23 -1,0 +1,22 @@@
- CONFIG_ETH_DESIGNWARE=y
 +CONFIG_ARM=y
 +CONFIG_ARCH_MESON=y
 +CONFIG_MESON_GXBB=y
 +CONFIG_TARGET_ODROID_C2=y
 +CONFIG_DEFAULT_DEVICE_TREE="meson-gxbb-odroidc2"
 +# CONFIG_CMD_BDI is not set
 +# CONFIG_CMD_IMI is not set
 +# CONFIG_CMD_IMLS is not set
 +# CONFIG_CMD_LOADS is not set
 +# CONFIG_CMD_FPGA is not set
 +# CONFIG_CMD_SOURCE is not set
 +# CONFIG_CMD_SETEXPR is not set
 +CONFIG_OF_CONTROL=y
 +CONFIG_NET_RANDOM_ETHADDR=y
 +CONFIG_DM_ETH=y
 +CONFIG_DEBUG_UART=y
 +CONFIG_DEBUG_UART_MESON=y
 +CONFIG_DEBUG_UART_BASE=0xc81004c0
 +CONFIG_DEBUG_UART_CLOCK=24000000
 +CONFIG_DEBUG_UART_ANNOUNCE=y
 +CONFIG_DEBUG_UART_SKIP_INIT=y
 +CONFIG_MESON_SERIAL=y
diff --combined drivers/clk/clk_rk3288.c
index a110a1c160e3d89d2cbe649d8aefa7970afb9030,e763a1c8e91fdea8067f976ceee5e8697bcea964..d88893c8ea629198746fbf8a0cfb7cb8eaeb6839
@@@ -326,17 -326,6 +326,17 @@@ static int pll_para_config(ulong freq_h
        return 0;
  }
  
 +static int rockchip_mac_set_clk(struct rk3288_cru *cru,
 +                                int periph, uint freq)
 +{
 +      /* Assuming mac_clk is fed by an external clock */
 +      rk_clrsetreg(&cru->cru_clksel_con[21],
 +                   RMII_EXTCLK_MASK << RMII_EXTCLK_SHIFT,
 +                   RMII_EXTCLK_SELECT_EXT_CLK << RMII_EXTCLK_SHIFT);
 +
 +       return 0;
 +}
 +
  static int rockchip_vop_set_clk(struct rk3288_cru *cru, struct rk3288_grf *grf,
                                int periph, unsigned int rate_hz)
  {
@@@ -770,9 -759,6 +770,9 @@@ static ulong rk3288_set_periph_rate(str
                new_rate = rockchip_spi_set_clk(cru, gclk_rate, periph, rate);
                break;
  #ifndef CONFIG_SPL_BUILD
 +      case SCLK_MAC:
 +              new_rate = rockchip_mac_set_clk(priv->cru, periph, rate);
 +              break;
        case DCLK_VOP0:
        case DCLK_VOP1:
                new_rate = rockchip_vop_set_clk(cru, priv->grf, periph, rate);
@@@ -891,7 -877,7 +891,7 @@@ static int rk3288_clk_bind(struct udevi
        }
  
        /* The reset driver does not have a device node, so bind it here */
-       ret = device_bind_driver(gd->dm_root, "rk3288_reset", "reset", &dev);
+       ret = device_bind_driver(gd->dm_root, "rk3288_sysreset", "reset", &dev);
        if (ret)
                debug("Warning: No RK3288 reset driver: ret=%d\n", ret);
  
diff --combined include/efi_loader.h
index b1ca4ba26b668ed70259e32633d2b0a89ff62c29,44a950f4842e590ccf1af1d9ae0c4816c6073755..3332d61cefc9fc5754f45e9732b5aebc3f557441
@@@ -91,12 -91,6 +91,12 @@@ extern struct list_head efi_obj_list
  int efi_disk_register(void);
  /* Called by bootefi to make GOP (graphical) interface available */
  int efi_gop_register(void);
 +/* Called by bootefi to make the network interface available */
 +int efi_net_register(void **handle);
 +
 +/* Called by networking code to memorize the dhcp ack package */
 +void efi_net_set_dhcp_ack(void *pkt, int len);
 +
  /*
   * Stub implementation for a protocol opener that just returns the handle as
   * interface
@@@ -139,13 -133,8 +139,13 @@@ uint64_t efi_add_memory_map(uint64_t st
  /* Called by board init to initialize the EFI memory map */
  int efi_memory_init(void);
  
 +#ifdef CONFIG_EFI_LOADER_BOUNCE_BUFFER
 +extern void *efi_bounce_buffer;
 +#define EFI_LOADER_BOUNCE_BUFFER_SIZE (64 * 1024 * 1024)
 +#endif
 +
  /* Convert strings from normal C strings to uEFI strings */
- static inline void ascii2unicode(u16 *unicode, char *ascii)
+ static inline void ascii2unicode(u16 *unicode, const char *ascii)
  {
        while (*ascii)
                *(unicode++) = *(ascii++);
  static inline void efi_restore_gd(void) { }
  static inline void efi_set_bootdev(const char *dev, const char *devnr,
                                   const char *path) { }
 +static inline void efi_net_set_dhcp_ack(void *pkt, int len) { }
  
  #endif
index c7d4515321ea431b3ccc5184d76da6d3494f0ba8,3095bcfa2bfd2fd8552f20a99ef65135c8bb3247..f9ad6156b71eaaac247a0d9cc17a3e681a822cfa
@@@ -8,6 -8,7 +8,7 @@@
  
  #include <common.h>
  #include <blk.h>
+ #include <dm.h>
  #include <efi_loader.h>
  #include <inttypes.h>
  #include <part.h>
@@@ -76,6 -77,9 +77,6 @@@ static efi_status_t EFIAPI efi_disk_rw_
        int blocks;
        unsigned long n;
  
 -      EFI_ENTRY("%p, %x, %"PRIx64", %lx, %p", this, media_id, lba,
 -                buffer_size, buffer);
 -
        diskobj = container_of(this, struct efi_disk_obj, ops);
        if (!(desc = blk_get_dev(diskobj->ifname, diskobj->dev_index)))
                return EFI_EXIT(EFI_DEVICE_ERROR);
        if (buffer_size & (blksz - 1))
                return EFI_EXIT(EFI_DEVICE_ERROR);
  
-       if (direction == EFI_DISK_READ) {
-               n = desc->block_read(desc, lba, blocks, buffer);
-       } else {
-               n = desc->block_write(desc, lba, blocks, buffer);
-       }
+       if (direction == EFI_DISK_READ)
+               n = blk_dread(desc, lba, blocks, buffer);
+       else
+               n = blk_dwrite(desc, lba, blocks, buffer);
  
        /* We don't do interrupts, so check for timers cooperatively */
        efi_timer_check();
@@@ -114,70 -117,16 +114,70 @@@ static efi_status_t efi_disk_read_block
                        u32 media_id, u64 lba, unsigned long buffer_size,
                        void *buffer)
  {
 -      return efi_disk_rw_blocks(this, media_id, lba, buffer_size, buffer,
 -                                EFI_DISK_READ);
 +      void *real_buffer = buffer;
 +      efi_status_t r;
 +
 +#ifdef CONFIG_EFI_LOADER_BOUNCE_BUFFER
 +      if (buffer_size > EFI_LOADER_BOUNCE_BUFFER_SIZE) {
 +              r = efi_disk_read_blocks(this, media_id, lba,
 +                      EFI_LOADER_BOUNCE_BUFFER_SIZE, buffer);
 +              if (r != EFI_SUCCESS)
 +                      return r;
 +              return efi_disk_read_blocks(this, media_id, lba +
 +                      EFI_LOADER_BOUNCE_BUFFER_SIZE / this->media->block_size,
 +                      buffer_size - EFI_LOADER_BOUNCE_BUFFER_SIZE,
 +                      buffer + EFI_LOADER_BOUNCE_BUFFER_SIZE);
 +      }
 +
 +      real_buffer = efi_bounce_buffer;
 +#endif
 +
 +      EFI_ENTRY("%p, %x, %"PRIx64", %lx, %p", this, media_id, lba,
 +                buffer_size, buffer);
 +
 +      r = efi_disk_rw_blocks(this, media_id, lba, buffer_size, real_buffer,
 +                             EFI_DISK_READ);
 +
 +      /* Copy from bounce buffer to real buffer if necessary */
 +      if ((r == EFI_SUCCESS) && (real_buffer != buffer))
 +              memcpy(buffer, real_buffer, buffer_size);
 +
 +      return EFI_EXIT(r);
  }
  
  static efi_status_t efi_disk_write_blocks(struct efi_block_io *this,
                        u32 media_id, u64 lba, unsigned long buffer_size,
                        void *buffer)
  {
 -      return efi_disk_rw_blocks(this, media_id, lba, buffer_size, buffer,
 -                                EFI_DISK_WRITE);
 +      void *real_buffer = buffer;
 +      efi_status_t r;
 +
 +#ifdef CONFIG_EFI_LOADER_BOUNCE_BUFFER
 +      if (buffer_size > EFI_LOADER_BOUNCE_BUFFER_SIZE) {
 +              r = efi_disk_write_blocks(this, media_id, lba,
 +                      EFI_LOADER_BOUNCE_BUFFER_SIZE, buffer);
 +              if (r != EFI_SUCCESS)
 +                      return r;
 +              return efi_disk_write_blocks(this, media_id, lba +
 +                      EFI_LOADER_BOUNCE_BUFFER_SIZE / this->media->block_size,
 +                      buffer_size - EFI_LOADER_BOUNCE_BUFFER_SIZE,
 +                      buffer + EFI_LOADER_BOUNCE_BUFFER_SIZE);
 +      }
 +
 +      real_buffer = efi_bounce_buffer;
 +#endif
 +
 +      EFI_ENTRY("%p, %x, %"PRIx64", %lx, %p", this, media_id, lba,
 +                buffer_size, buffer);
 +
 +      /* Populate bounce buffer if necessary */
 +      if (real_buffer != buffer)
 +              memcpy(real_buffer, buffer, buffer_size);
 +
 +      r = efi_disk_rw_blocks(this, media_id, lba, buffer_size, real_buffer,
 +                             EFI_DISK_WRITE);
 +
 +      return EFI_EXIT(r);
  }
  
  static efi_status_t EFIAPI efi_disk_flush_blocks(struct efi_block_io *this)
@@@ -194,8 -143,8 +194,8 @@@ static const struct efi_block_io block_
        .flush_blocks = &efi_disk_flush_blocks,
  };
  
- static void efi_disk_add_dev(char *name,
-                            const struct blk_driver *cur_drvr,
+ static void efi_disk_add_dev(const char *name,
+                            const char *if_typename,
                             const struct blk_desc *desc,
                             int dev_index,
                             lbaint_t offset)
        diskobj->parent.protocols[1].open = efi_disk_open_dp;
        diskobj->parent.handle = diskobj;
        diskobj->ops = block_io_disk_template;
-       diskobj->ifname = cur_drvr->if_typename;
+       diskobj->ifname = if_typename;
        diskobj->dev_index = dev_index;
        diskobj->offset = offset;
  
  }
  
  static int efi_disk_create_eltorito(struct blk_desc *desc,
-                                   const struct blk_driver *cur_drvr,
+                                   const char *if_typename,
                                    int diskid)
  {
        int disks = 0;
                return 0;
  
        while (!part_get_info(desc, part, &info)) {
-               snprintf(devname, sizeof(devname), "%s%d:%d",
-                        cur_drvr->if_typename, diskid, part);
-               efi_disk_add_dev(devname, cur_drvr, desc, diskid, info.start);
+               snprintf(devname, sizeof(devname), "%s%d:%d", if_typename,
+                        diskid, part);
+               efi_disk_add_dev(devname, if_typename, desc, diskid,
+                                info.start);
                part++;
                disks++;
        }
   * EFI payload, we scan through all of the potentially available ones and
   * store them in our object pool.
   *
+  * TODO(sjg@chromium.org): Actually with CONFIG_BLK, U-Boot does have this.
+  * Consider converting the code to look up devices as needed. The EFI device
+  * could be a child of the UCLASS_BLK block device, perhaps.
+  *
   * This gets called from do_bootefi_exec().
   */
  int efi_disk_register(void)
  {
-       const struct blk_driver *cur_drvr;
-       int i, if_type;
        int disks = 0;
+ #ifdef CONFIG_BLK
+       struct udevice *dev;
+       for (uclass_first_device(UCLASS_BLK, &dev);
+            dev;
+            uclass_next_device(&dev)) {
+               struct blk_desc *desc = dev_get_uclass_platdata(dev);
+               const char *if_typename = dev->driver->name;
+               printf("Scanning disk %s...\n", dev->name);
+               efi_disk_add_dev(dev->name, if_typename, desc, desc->devnum, 0);
+               disks++;
+               /*
+               * El Torito images show up as block devices in an EFI world,
+               * so let's create them here
+               */
+               disks += efi_disk_create_eltorito(desc, if_typename,
+                                                 desc->devnum);
+       }
+ #else
+       int i, if_type;
  
        /* Search for all available disk devices */
        for (if_type = 0; if_type < IF_TYPE_COUNT; if_type++) {
+               const struct blk_driver *cur_drvr;
+               const char *if_typename;
                cur_drvr = blk_driver_lookup_type(if_type);
                if (!cur_drvr)
                        continue;
  
-               printf("Scanning disks on %s...\n", cur_drvr->if_typename);
+               if_typename = cur_drvr->if_typename;
+               printf("Scanning disks on %s...\n", if_typename);
                for (i = 0; i < 4; i++) {
                        struct blk_desc *desc;
                        char devname[32] = { 0 }; /* dp->str is u16[32] long */
                                continue;
  
                        snprintf(devname, sizeof(devname), "%s%d",
-                                cur_drvr->if_typename, i);
-                       efi_disk_add_dev(devname, cur_drvr, desc, i, 0);
+                                if_typename, i);
+                       efi_disk_add_dev(devname, if_typename, desc, i, 0);
                        disks++;
  
                        /*
                         * El Torito images show up as block devices
                         * in an EFI world, so let's create them here
                         */
-                       disks += efi_disk_create_eltorito(desc, cur_drvr, i);
+                       disks += efi_disk_create_eltorito(desc, if_typename, i);
                }
        }
+ #endif
        printf("Found %d disks\n", disks);
  
        return 0;