[U-Boot] [PATCH 09/14] pci: Use common functions to read/write config

Bin Meng bmeng.cn at gmail.com
Fri Nov 13 08:11:10 CET 2015


Hi Simon,

On Fri, Nov 13, 2015 at 5:45 AM, Simon Glass <sjg at chromium.org> wrote:
> Currently we using switch() and access PCI configuration via several

using -> use

> functions, one for each data size. Adjust the code to use generic functions,
> where the data size is a parameter.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
>  common/cmd_pci.c | 49 +++++++++++++++----------------------------------
>  1 file changed, 15 insertions(+), 34 deletions(-)
>
> diff --git a/common/cmd_pci.c b/common/cmd_pci.c
> index 53b0f42..306e734 100644
> --- a/common/cmd_pci.c
> +++ b/common/cmd_pci.c
> @@ -330,7 +330,8 @@ static pci_dev_t get_pci_dev(char* name)
>         return PCI_BDF(bdfs[0], bdfs[1], bdfs[2]);
>  }
>
> -static int pci_cfg_display(pci_dev_t bdf, ulong addr, ulong size, ulong length)
> +static int pci_cfg_display(pci_dev_t bdf, ulong addr, enum pci_size_t size,
> +                          ulong length)
>  {
>  #define DISP_LINE_LEN  16
>         ulong i, nbytes, linebytes;
> @@ -344,23 +345,13 @@ static int pci_cfg_display(pci_dev_t bdf, ulong addr, ulong size, ulong length)
>          */
>         nbytes = length * size;
>         do {
> -               uint    val4;
> -               ushort  val2;
> -               u_char  val1;
> -
>                 printf("%08lx:", addr);
>                 linebytes = (nbytes>DISP_LINE_LEN)?DISP_LINE_LEN:nbytes;
>                 for (i=0; i<linebytes; i+= size) {
> -                       if (size == 4) {
> -                               pci_read_config_dword(bdf, addr, &val4);
> -                               printf(" %08x", val4);
> -                       } else if (size == 2) {
> -                               pci_read_config_word(bdf, addr, &val2);
> -                               printf(" %04x", val2);
> -                       } else {
> -                               pci_read_config_byte(bdf, addr, &val1);
> -                               printf(" %02x", val1);
> -                       }
> +                       unsigned long val;
> +
> +                       val = pci_read_config(bdf, addr, size);
> +                       printf(" %*lx", pci_field_width(size), val);

I think this should be "%.*x"

>                         addr += size;
>                 }
>                 printf("\n");
> @@ -390,32 +381,20 @@ static int pci_cfg_write (pci_dev_t bdf, ulong addr, ulong size, ulong value)
>         return 0;
>  }
>
> -static int
> -pci_cfg_modify (pci_dev_t bdf, ulong addr, ulong size, ulong value, int incrflag)
> +static int pci_cfg_modify(pci_dev_t bdf, ulong addr, enum pci_size_t size,
> +                         ulong value, int incrflag)
>  {
>         ulong   i;
>         int     nbytes;
> -       uint    val4;
> -       ushort  val2;
> -       u_char  val1;
> +       ulong val;
>
>         /* Print the address, followed by value.  Then accept input for
>          * the next value.  A non-converted value exits.
>          */
>         do {
>                 printf("%08lx:", addr);
> -               if (size == 4) {
> -                       pci_read_config_dword(bdf, addr, &val4);
> -                       printf(" %08x", val4);
> -               }
> -               else if (size == 2) {
> -                       pci_read_config_word(bdf, addr, &val2);
> -                       printf(" %04x", val2);
> -               }
> -               else {
> -                       pci_read_config_byte(bdf, addr, &val1);
> -                       printf(" %02x", val1);
> -               }
> +               val = pci_read_config(bdf, addr, size);
> +               printf(" %*lx", pci_field_width(size), val);

"%.*x"?

>
>                 nbytes = cli_readline(" ? ");
>                 if (nbytes == 0 || (nbytes == 1 && console_buffer[0] == '-')) {
> @@ -461,7 +440,8 @@ pci_cfg_modify (pci_dev_t bdf, ulong addr, ulong size, ulong value, int incrflag
>   */
>  static int do_pci(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>  {
> -       ulong addr = 0, value = 0, size = 0;
> +       ulong addr = 0, value = 0, cmd_size = 0;
> +       enum pci_size_t size;
>         int busnum = 0;
>         pci_dev_t bdf = 0;
>         char cmd = 's';
> @@ -476,7 +456,8 @@ static int do_pci(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
>         case 'm':               /* modify */
>         case 'w':               /* write */
>                 /* Check for a size specification. */
> -               size = cmd_get_data_size(argv[1], 4);
> +               cmd_size = cmd_get_data_size(argv[1], 4);
> +               size = (cmd_size == 4) ? PCI_SIZE_32 : size - 1;
>                 if (argc > 3)
>                         addr = simple_strtoul(argv[3], NULL, 16);
>                 if (argc > 4)
> --

Regards,
Bin


More information about the U-Boot mailing list