Add a full set of pci access functions.
[coreboot.git] / payloads / coreinfo / pci_module.c
index 723c51377dcb05519874d3625b88428e437869f2..b2cd8a01f5d9eb28295ca94d806a10eeb3a9bc49 100644 (file)
@@ -6,20 +6,23 @@
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; version 2 of the License.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
  */
 
 #include <arch/io.h>
+#include <libpayload.h>
 #include "coreinfo.h"
 
+#ifdef CONFIG_MODULE_PCI
+
 struct pci_devices {
        unsigned short device;
        unsigned int id;
@@ -28,17 +31,6 @@ struct pci_devices {
 static struct pci_devices devices[64];
 static int devices_index;
 
-#define REG_VENDOR_ID   0x00
-#define REG_HEADER_TYPE 0x0E
-#define REG_PRIMARY_BUS 0x18
-
-#define HEADER_TYPE_NORMAL  0
-#define HEADER_TYPE_BRIDGE  1
-#define HEADER_TYPE_CARDBUS 2
-
-#define PCI_ADDR(_bus, _dev, _reg) \
-(0x80000000 | (_bus << 16) | (_dev << 8) | (_reg & ~3))
-
 /* Number of entries to show in the list */
 #define MENU_VISIBLE 16
 
@@ -67,8 +59,7 @@ static int partition(struct pci_devices *list, int len)
 
        swap(&list[len / 2], &list[len - 1]);
 
-       for(i = 0; i < len - 1; i++) {
-
+       for (i = 0; i < len - 1; i++) {
                if (list[i].device < val) {
                        swap(&list[i], &list[index]);
                        index++;
@@ -76,6 +67,7 @@ static int partition(struct pci_devices *list, int len)
        }
 
        swap(&list[index], &list[len - 1]);
+
        return index;
 }
 
@@ -92,99 +84,85 @@ static void quicksort(struct pci_devices *list, int len)
        quicksort(&(list[index]), len - index);
 }
 
-static void pci_read_dword(unsigned int bus, unsigned int devfn,
-                          unsigned int reg, unsigned int *val)
-{
-       outl(PCI_ADDR(bus, devfn, reg), 0xCF8);
-       *val = inl(0xCFC);
-}
-
-static void pci_read_byte(unsigned int bus, unsigned int devfn,
-                         unsigned int reg, unsigned char *val)
-{
-       outl(PCI_ADDR(bus, devfn, reg), 0xCF8);
-       *val = inb(0xCFC + (reg & 3));
-}
-
-static int show_config_space(WINDOW *win, int row, int col, int index)
+static void show_config_space(WINDOW *win, int row, int col, int index)
 {
        unsigned char cspace[64];
        int bus, devfn;
        int i, x, y;
 
-       bus = (devices[index].device >> 8) & 0xFF;
-       devfn = devices[index].device & 0xFF;
+       bus = (devices[index].device >> 8) & 0xff;
+       devfn = devices[index].device & 0xff;
 
-       for(i = 0; i < 64; i+= 4)
-               pci_read_dword(bus, devfn, i, ((int *) &cspace[i]));
+       for (i = 0; i < 64; i += 4)
+               cspace[i] = pci_read_config32(PCI_DEV(bus, PCI_SLOT(devfn),
+                                       PCI_FUNC(devfn)), i);
 
-       for(y = 0; y < 4; y++) {
-               for(x = 0; x < 16; x++)
-                       mvwprintw(win, row + y, col + (x * 3), "%2.2X ", cspace[(y * 16) + x]);
+       for (y = 0; y < 4; y++) {
+               for (x = 0; x < 16; x++)
+                       mvwprintw(win, row + y, col + (x * 3), "%2.2X ",
+                                 cspace[(y * 16) + x]);
        }
 }
 
-int pci_module_redraw(WINDOW *win)
+static int pci_module_redraw(WINDOW *win)
 {
        unsigned int bus, devfn, func;
-       int i;
-       int last;
+       int i, last;
 
        print_module_title(win, "PCI Device List");
 
        last = menu_first + MENU_VISIBLE;
 
        if (last > devices_index)
-         last = devices_index;
+               last = devices_index;
 
-       for(i = 0; i < MENU_VISIBLE; i++) {
+       for (i = 0; i < MENU_VISIBLE; i++) {
                int item = menu_first + i;
 
-               /* Draw a blank space */
-
+               /* Draw a blank space. */
                if (item >= devices_index) {
                        wattrset(win, COLOR_PAIR(2));
                        mvwprintw(win, 2 + i, 1, "                 ");
                        continue;
                }
 
-               bus = (devices[item].device >> 8) & 0xFF;
-               devfn = (devices[item].device & 0xFF) / 8;
-               func = (devices[item].device & 0xFF) % 8;
+               bus = (devices[item].device >> 8) & 0xff;
+               devfn = (devices[item].device & 0xff) / 8;
+               func = (devices[item].device & 0xff) % 8;
 
                if (item == menu_selected)
                        wattrset(win, COLOR_PAIR(3) | A_BOLD);
                else
                        wattrset(win, COLOR_PAIR(2));
 
-               mvwprintw(win, 2+i, 1, "%X:%2.2X.%2.2X %X:%X  ",
+               mvwprintw(win, 2 + i, 1, "%X:%2.2X.%2.2X %04X:%04X  ",
                          bus, devfn, func,
-                         devices[item].id & 0xFFFF,
-                         (devices[item].id >> 16) & 0xFFFF);
+                         devices[item].id & 0xffff,
+                         (devices[item].id >> 16) & 0xffff);
 
                wattrset(win, COLOR_PAIR(2));
 
                if (i == 0) {
                        if (item != 0)
-                               mvwprintw(win, 2+ i, 19, "\30");
+                               mvwprintw(win, 2 + i, 19, "\30");
                }
                if (i == MENU_VISIBLE - 1) {
                        if ((item + 1) < devices_index)
-                               mvwprintw(win, 2+ i, 19, "\31");
+                               mvwprintw(win, 2 + i, 19, "\31");
                }
        }
 
        wattrset(win, COLOR_PAIR(2));
 
-       for(i = 0; i < 16; i++)
+       for (i = 0; i < 16; i++)
                mvwprintw(win, 2, 26 + (i * 3), "%2.2X ", i);
 
        wmove(win, 3, 25);
 
-       for(i = 0; i < 48; i++)
+       for (i = 0; i < 48; i++)
                waddch(win, (i == 0) ? '\332' : '\304');
 
-       for(i = 0; i < 4; i++) {
+       for (i = 0; i < 4; i++) {
                mvwprintw(win, 4 + i, 23, "%2.2X", i * 16);
                wmove(win, 4 + i, 25);
                waddch(win, '\263');
@@ -201,40 +179,37 @@ static void pci_scan_bus(int bus)
        unsigned int val;
        unsigned char hdr;
 
-       for(devfn = 0; devfn < 0x100; ) {
-               for(func = 0; func < 8; func++, devfn++) {
-                       pci_read_dword(bus, devfn, REG_VENDOR_ID, &val);
+       for (devfn = 0; devfn < 0x100;) {
+               for (func = 0; func < 8; func++, devfn++) {
+                       pcidev_t dev = PCI_DEV(bus, PCI_SLOT(devfn),
+                                       PCI_FUNC(devfn));
 
-                       /* Nobody home */
+                       val = pci_read_config32(dev, REG_VENDOR_ID);
 
+                       /* Nobody home. */
                        if (val == 0xffffffff || val == 0x00000000 ||
                            val == 0x0000ffff || val == 0xffff0000)
                                continue;
 
-                       /* FIXME: Remove this arbitrary limitation */
-
+                       /* FIXME: Remove this arbitrary limitation. */
                        if (devices_index >= 64)
                                return;
 
-                       devices[devices_index].device = 
-                               ((bus & 0xFF) << 8) | (devfn & 0xFF);
+                       devices[devices_index].device =
+                           ((bus & 0xff) << 8) | (devfn & 0xff);
 
                        devices[devices_index++].id = val;
 
-                       /* If this is a bridge, then follow it */
-
-                       pci_read_byte(bus, devfn, REG_HEADER_TYPE, &hdr);
-
-                       hdr &= 0x7F;
-
+                       /* If this is a bridge, then follow it. */
+                       hdr = pci_read_config8(dev, REG_HEADER_TYPE);
+                       hdr &= 0x7f;
                        if (hdr == HEADER_TYPE_BRIDGE ||
                            hdr == HEADER_TYPE_CARDBUS) {
                                unsigned int busses;
 
-                               pci_read_dword(bus, devfn, REG_PRIMARY_BUS,
-                                              &busses);
+                               busses = pci_read_config32(dev, REG_PRIMARY_BUS);
 
-                               pci_scan_bus((busses >> 8) & 0xFF);
+                               pci_scan_bus((busses >> 8) & 0xff);
 
                        }
                }
@@ -243,25 +218,22 @@ static void pci_scan_bus(int bus)
        quicksort(devices, devices_index);
 }
 
-int pci_module_handle(int key)
+static int pci_module_handle(int key)
 {
        int ret = 0;
 
-       switch(key) {
+       switch (key) {
        case KEY_DOWN:
                if (menu_selected + 1 < devices_index) {
                        menu_selected++;
                        ret = 1;
                }
-
                break;
-
        case KEY_UP:
                if (menu_selected > 0) {
                        menu_selected--;
                        ret = 1;
                }
-
                break;
        }
 
@@ -276,18 +248,12 @@ int pci_module_handle(int key)
                        menu_first = 0;
        }
 
-
        return ret;
 }
 
-int pci_module_init(void)
+static int pci_module_init(void)
 {
-       unsigned int val;
-       int bus = 0;
-
-
        pci_scan_bus(0);
-
        return 0;
 }
 
@@ -297,3 +263,10 @@ struct coreinfo_module pci_module = {
        .redraw = pci_module_redraw,
        .handle = pci_module_handle,
 };
+
+#else
+
+struct coreinfo_module pci_module = {
+};
+
+#endif