pci: Use common functions to read/write config
authorSimon Glass <sjg@chromium.org>
Fri, 27 Nov 2015 02:51:26 +0000 (19:51 -0700)
committerSimon Glass <sjg@chromium.org>
Tue, 1 Dec 2015 13:26:37 +0000 (06:26 -0700)
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>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Tested-by: Bin Meng <bmeng.cn@gmail.com>
common/cmd_pci.c

index c0765fd7fb49b143c816ceeda1b656430460f6c8..3c13e415c25261f8229c217e1f1161e7a1c0b671 100644 (file)
@@ -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)