[U-Boot] [PATCH v3 09/13] pci: Use common functions to read/write config
Bin Meng
bmeng.cn at gmail.com
Fri Nov 27 08:37:53 CET 2015
On Fri, Nov 27, 2015 at 10:51 AM, Simon Glass <sjg at 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 at 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 at gmail.com>
Tested-by: Bin Meng <bmeng.cn at gmail.com>
More information about the U-Boot
mailing list