Message ID | 1448592690-14911-10-git-send-email-sjg@chromium.org |
---|---|
State | Accepted |
Headers | show |
On Fri, Nov 27, 2015 at 10:51 AM, Simon Glass <sjg@chromium.org> wrote: > Currently we use switch() and access PCI configuration via several > 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@chromium.org> > --- > > Changes in v3: > - Fix mix-up between PCI_SIZE_xx and byte size > > Changes in v2: > - Add back the leading 0 in the printf() statements > > common/cmd_pci.c | 74 ++++++++++++++++++++++++-------------------------------- > 1 file changed, 31 insertions(+), 43 deletions(-) > > diff --git a/common/cmd_pci.c b/common/cmd_pci.c > index 7fdd3d8..4874033 100644 > --- a/common/cmd_pci.c > +++ b/common/cmd_pci.c > @@ -28,19 +28,24 @@ struct pci_reg_info { > u8 offset; > }; > > -static int pci_field_width(enum pci_size_t size) > +static int pci_byte_size(enum pci_size_t size) > { > switch (size) { > case PCI_SIZE_8: > - return 2; > + return 1; > case PCI_SIZE_16: > - return 4; > + return 2; > case PCI_SIZE_32: > default: > - return 8; > + return 4; > } > } > > +static int pci_field_width(enum pci_size_t size) > +{ > + return pci_byte_size(size) * 2; > +} > + > static unsigned long pci_read_config(pci_dev_t dev, int offset, > enum pci_size_t size) > { > @@ -325,38 +330,31 @@ 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; > + int byte_size; > int rc = 0; > > + byte_size = pci_byte_size(size); > if (length == 0) > - length = 0x40 / size; /* Standard PCI configuration space */ > + length = 0x40 / byte_size; /* Standard PCI config space */ > > /* Print the lines. > * once, and all accesses are with the specified bus width. > */ > - nbytes = length * size; > + nbytes = length * byte_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); > - } > - addr += size; > + linebytes = (nbytes > DISP_LINE_LEN) ? DISP_LINE_LEN : nbytes; > + for (i = 0; i < linebytes; i += byte_size) { > + unsigned long val; > + > + val = pci_read_config(bdf, addr, size); > + printf(" %0*lx", pci_field_width(size), val); > + addr += byte_size; > } > printf("\n"); > nbytes -= linebytes; > @@ -385,32 +383,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(" %0*lx", pci_field_width(size), val); > > nbytes = cli_readline(" ? "); > if (nbytes == 0 || (nbytes == 1 && console_buffer[0] == '-')) { > @@ -456,7 +442,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 = PCI_SIZE_32; > int busnum = 0; > pci_dev_t bdf = 0; > char cmd = 's'; > @@ -471,7 +458,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 : cmd_size - 1; > if (argc > 3) > addr = simple_strtoul(argv[3], NULL, 16); > if (argc > 4) > -- Reviewed-by: Bin Meng <bmeng.cn@gmail.com> Tested-by: Bin Meng <bmeng.cn@gmail.com>
On 26 November 2015 at 23:37, Bin Meng <bmeng.cn@gmail.com> wrote: > On Fri, Nov 27, 2015 at 10:51 AM, Simon Glass <sjg@chromium.org> wrote: >> Currently we use switch() and access PCI configuration via several >> 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@chromium.org> >> --- >> >> Changes in v3: >> - Fix mix-up between PCI_SIZE_xx and byte size >> >> Changes in v2: >> - Add back the leading 0 in the printf() statements >> >> common/cmd_pci.c | 74 ++++++++++++++++++++++++-------------------------------- >> 1 file changed, 31 insertions(+), 43 deletions(-) >> [snip] > > Reviewed-by: Bin Meng <bmeng.cn@gmail.com> > Tested-by: Bin Meng <bmeng.cn@gmail.com> Applied to u-boot-dm.
diff --git a/common/cmd_pci.c b/common/cmd_pci.c index 7fdd3d8..4874033 100644 --- a/common/cmd_pci.c +++ b/common/cmd_pci.c @@ -28,19 +28,24 @@ struct pci_reg_info { u8 offset; }; -static int pci_field_width(enum pci_size_t size) +static int pci_byte_size(enum pci_size_t size) { switch (size) { case PCI_SIZE_8: - return 2; + return 1; case PCI_SIZE_16: - return 4; + return 2; case PCI_SIZE_32: default: - return 8; + return 4; } } +static int pci_field_width(enum pci_size_t size) +{ + return pci_byte_size(size) * 2; +} + static unsigned long pci_read_config(pci_dev_t dev, int offset, enum pci_size_t size) { @@ -325,38 +330,31 @@ 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; + int byte_size; int rc = 0; + byte_size = pci_byte_size(size); if (length == 0) - length = 0x40 / size; /* Standard PCI configuration space */ + length = 0x40 / byte_size; /* Standard PCI config space */ /* Print the lines. * once, and all accesses are with the specified bus width. */ - nbytes = length * size; + nbytes = length * byte_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); - } - addr += size; + linebytes = (nbytes > DISP_LINE_LEN) ? DISP_LINE_LEN : nbytes; + for (i = 0; i < linebytes; i += byte_size) { + unsigned long val; + + val = pci_read_config(bdf, addr, size); + printf(" %0*lx", pci_field_width(size), val); + addr += byte_size; } printf("\n"); nbytes -= linebytes; @@ -385,32 +383,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(" %0*lx", pci_field_width(size), val); nbytes = cli_readline(" ? "); if (nbytes == 0 || (nbytes == 1 && console_buffer[0] == '-')) { @@ -456,7 +442,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 = PCI_SIZE_32; int busnum = 0; pci_dev_t bdf = 0; char cmd = 's'; @@ -471,7 +458,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 : cmd_size - 1; if (argc > 3) addr = simple_strtoul(argv[3], NULL, 16); if (argc > 4)
Currently we use switch() and access PCI configuration via several 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@chromium.org> --- Changes in v3: - Fix mix-up between PCI_SIZE_xx and byte size Changes in v2: - Add back the leading 0 in the printf() statements common/cmd_pci.c | 74 ++++++++++++++++++++++++-------------------------------- 1 file changed, 31 insertions(+), 43 deletions(-)