diff mbox

[U-Boot,v3,09/13] pci: Use common functions to read/write config

Message ID 1448592690-14911-10-git-send-email-sjg@chromium.org
State Accepted
Headers show

Commit Message

Simon Glass Nov. 27, 2015, 2:51 a.m. UTC
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(-)

Comments

Bin Meng Nov. 27, 2015, 7:37 a.m. UTC | #1
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>
Simon Glass Nov. 28, 2015, 4:55 p.m. UTC | #2
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 mbox

Patch

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)