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

Simon Glass sjg at chromium.org
Thu Nov 12 22:45:30 CET 2015


Currently we using 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>
---

 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);
 			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);
 
 		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)
-- 
2.6.0.rc2.230.g3dd15c0



More information about the U-Boot mailing list