All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Vladimir 'φ-coder/phcoder' Serbinenko" <phcoder@gmail.com>
To: grub-devel@gnu.org
Subject: Re: [PATCH] Support Openfirmware disks with non-512B sectors
Date: Tue, 19 Feb 2013 10:03:57 +0100	[thread overview]
Message-ID: <51233FFD.5070602@gmail.com> (raw)
In-Reply-To: <20130130142155.Horde.QZAScJir309RCXLTP2oUy-A@imap.linux.ibm.com>

[-- Attachment #1: Type: text/plain, Size: 4983 bytes --]

Committed, thanks. Sorry for delay.

On 30.01.2013 20:21, Paulo Flabiano Smorigo/Brazil/IBM wrote:

> === modified file 'ChangeLog'
> --- ChangeLog	2013-01-27 15:17:21 +0000
> +++ ChangeLog	2013-01-28 16:39:41 +0000
> @@ -1,3 +1,15 @@
> +2013-01-28  Paulo Flabiano Smorigo <pfsmorigo@br.ibm.com>
> +
> +	Support Openfirmware disks with non-512B sectors.
> +
> +	* grub-core/disk/ieee1275/ofdisk.c (grub_ofdisk_open): Get the block
> +	size of the disk.
> +	* (grub_ofdisk_get_block_size): New function.
> +	* (grub_ofdisk_prepare): Use the correct block size.
> +	* (grub_ofdisk_read): Likewise.
> +	* (grub_ofdisk_write): Likewise.
> +	* include/grub/ieee1275/ofdisk.h (grub_ofdisk_get_block_size): New proto.
> +
>  2013-01-27  Andrey Borzenkov <arvidjaar@gmail.com>
>  
>  	* util/grub-install.in: change misleading comment about
> 
> === modified file 'grub-core/disk/ieee1275/ofdisk.c'
> --- grub-core/disk/ieee1275/ofdisk.c	2013-01-20 15:52:15 +0000
> +++ grub-core/disk/ieee1275/ofdisk.c	2013-01-30 19:05:49 +0000
> @@ -349,6 +349,14 @@
>        return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "not a block device");
>      }
>  
> +  grub_uint32_t block_size = 0;
> +  if (grub_ofdisk_get_block_size (devpath, &block_size) == 0)
> +    {
> +      for (disk->log_sector_size = 0;
> +           (1U << disk->log_sector_size) < block_size;
> +           disk->log_sector_size++);
> +    }
> +
>    /* XXX: There is no property to read the number of blocks.  There
>       should be a property `#blocks', but it is not there.  Perhaps it
>       is possible to use seek for this.  */
> @@ -415,7 +423,7 @@
>        last_devpath = disk->data;      
>      }
>  
> -  pos = sector << GRUB_DISK_SECTOR_BITS;
> +  pos = sector << disk->log_sector_size;
>  
>    grub_ieee1275_seek (last_ihandle, pos, &status);
>    if (status < 0)
> @@ -434,9 +442,9 @@
>    err = grub_ofdisk_prepare (disk, sector);
>    if (err)
>      return err;
> -  grub_ieee1275_read (last_ihandle, buf, size  << GRUB_DISK_SECTOR_BITS,
> +  grub_ieee1275_read (last_ihandle, buf, size  << disk->log_sector_size,
>  		      &actual);
> -  if (actual != (grub_ssize_t) (size  << GRUB_DISK_SECTOR_BITS))
> +  if (actual != (grub_ssize_t) (size  << disk->log_sector_size))
>      return grub_error (GRUB_ERR_READ_ERROR, N_("failure reading sector 0x%llx "
>  					       "from `%s'"),
>  		       (unsigned long long) sector,
> @@ -454,9 +462,9 @@
>    err = grub_ofdisk_prepare (disk, sector);
>    if (err)
>      return err;
> -  grub_ieee1275_write (last_ihandle, buf, size  << GRUB_DISK_SECTOR_BITS,
> +  grub_ieee1275_write (last_ihandle, buf, size  << disk->log_sector_size,
>  		       &actual);
> -  if (actual != (grub_ssize_t) (size << GRUB_DISK_SECTOR_BITS))
> +  if (actual != (grub_ssize_t) (size << disk->log_sector_size))
>      return grub_error (GRUB_ERR_WRITE_ERROR, N_("failure writing sector 0x%llx "
>  						"to `%s'"),
>  		       (unsigned long long) sector,
> @@ -493,3 +501,44 @@
>  
>    grub_disk_dev_unregister (&grub_ofdisk_dev);
>  }
> +
> +grub_err_t
> +grub_ofdisk_get_block_size (const char *device, grub_uint32_t *block_size)
> +{
> +  struct size_args_ieee1275
> +    {
> +      struct grub_ieee1275_common_hdr common;
> +      grub_ieee1275_cell_t method;
> +      grub_ieee1275_cell_t ihandle;
> +      grub_ieee1275_cell_t result;
> +      grub_ieee1275_cell_t size1;
> +      grub_ieee1275_cell_t size2;
> +    } args_ieee1275;
> +
> +  if (last_ihandle)
> +    grub_ieee1275_close (last_ihandle);
> +
> +  last_ihandle = 0;
> +  last_devpath = NULL;
> +
> +  grub_ieee1275_open (device, &last_ihandle);
> +  if (! last_ihandle)
> +    return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "can't open device");
> +
> +  INIT_IEEE1275_COMMON (&args_ieee1275.common, "call-method", 2, 2);
> +  args_ieee1275.method = (grub_ieee1275_cell_t) "block-size";
> +  args_ieee1275.ihandle = last_ihandle;
> +  args_ieee1275.result = 1;
> +
> +  *block_size = GRUB_DISK_SECTOR_SIZE;
> +
> +  if ((IEEE1275_CALL_ENTRY_FN (&args_ieee1275) == -1) || (args_ieee1275.result))
> +    grub_dprintf ("disk", "can't get block size\n");
> +  else
> +    if (args_ieee1275.size1
> +        && !(args_ieee1275.size1 & (args_ieee1275.size1 - 1))
> +        && args_ieee1275.size1 >= 512 && args_ieee1275.size1 <= 16384)
> +      *block_size = args_ieee1275.size1;
> +
> +  return 0;
> +}
> 
> === modified file 'include/grub/ieee1275/ofdisk.h'
> --- include/grub/ieee1275/ofdisk.h	2007-07-21 23:32:33 +0000
> +++ include/grub/ieee1275/ofdisk.h	2013-01-28 16:14:09 +0000
> @@ -22,4 +22,7 @@
>  extern void grub_ofdisk_init (void);
>  extern void grub_ofdisk_fini (void);
>  
> +extern grub_err_t grub_ofdisk_get_block_size (const char *device,
> +                                              grub_uint32_t *block_size);
> +
>  #endif /* ! GRUB_INIT_HEADER */
> 
> 
> 




[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 294 bytes --]

  reply	other threads:[~2013-02-19  9:04 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-01-22 17:44 [PATCH] Support Openfirmware disks with non-512B sectors Paulo Flabiano Smorigo/Brazil/IBM
2013-01-22 19:04 ` Seth Goldberg
2013-01-22 19:34   ` Paulo Flabiano Smorigo/Brazil/IBM
2013-01-22 19:35   ` Andrey Borzenkov
2013-01-22 19:39     ` Seth Goldberg
2013-01-23  6:53       ` Vladimir 'φ-coder/phcoder' Serbinenko
2013-01-23  7:17 ` Vladimir 'φ-coder/phcoder' Serbinenko
2013-01-28 17:18   ` Paulo Flabiano Smorigo/Brazil/IBM
2013-01-30  8:37     ` Vladimir 'φ-coder/phcoder' Serbinenko
2013-01-30 19:21       ` Paulo Flabiano Smorigo/Brazil/IBM
2013-02-19  9:03         ` Vladimir 'φ-coder/phcoder' Serbinenko [this message]
2013-02-19  2:04 ` Seth Goldberg

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=51233FFD.5070602@gmail.com \
    --to=phcoder@gmail.com \
    --cc=grub-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.