blob: ead98469f7fdd8786521852e49916fb86607faed [file] [log] [blame]
Patrick Georgid21f68b2008-09-02 16:06:22 +00001/*
2 * This file is part of the libpayload project.
3 *
4 * Copyright (C) 2008 coresystems GmbH
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
Jordan Crousedb8c0ab2008-11-24 17:54:46 +000030#include <libpayload-config.h>
Jordan Crouse29061a52008-09-11 17:29:00 +000031#include <usb/usb.h>
Patrick Georgid21f68b2008-09-02 16:06:22 +000032#include "uhci.h"
Jordan Crouse29061a52008-09-11 17:29:00 +000033#include <usb/usbdisk.h>
Patrick Georgid21f68b2008-09-02 16:06:22 +000034
35/**
36 * Initializes USB controller attached to PCI
37 *
38 * @param bus PCI bus number
39 * @param dev PCI device id at bus
40 * @param func function id of the controller
41 */
42int
43usb_controller_initialize (int bus, int dev, int func)
44{
45 u32 class;
46 u32 devclass;
47 u32 prog_if;
48 pcidev_t addr;
49 u32 pciid;
50
51 addr = PCI_DEV (bus, dev, func);
52 class = pci_read_config32 (addr, 8);
53 pciid = pci_read_config32 (addr, 0);
54
55 devclass = class >> 16;
56 prog_if = (class >> 8) & 0xff;
57
58 /* enable busmaster */
59#define PCI_COMMAND 4
60#define PCI_COMMAND_MASTER 4
61 pci_write_config32 (addr, PCI_COMMAND,
62 pci_read_config32 (addr,
63 PCI_COMMAND) |
64 PCI_COMMAND_MASTER);
65
66 if (devclass == 0xc03) {
67 printf ("%02x:%02x.%x %04x:%04x.%d ", 0, dev, func,
68 pciid >> 16, pciid & 0xFFFF, func);
69 if (prog_if == 0) {
70 printf ("UHCI controller\n");
71#ifdef CONFIG_USB_UHCI
72 uhci_init (addr);
73 usb_poll ();
74 usb_poll ();
75#else
76 printf ("Not supported.\n");
77#endif
78 }
79 if (prog_if == 0x10) {
80 printf ("OHCI controller\n");
81#ifdef CONFIG_USB_OHCI
82 // ohci_init(addr);
83#else
84 printf ("Not supported.\n");
85#endif
86
87 }
88 if (prog_if == 0x20) {
89 printf ("EHCI controller\n");
90#ifdef CONFIG_USB_EHCI
91 // ehci_init(addr);
92#else
93 printf ("Not supported.\n");
94#endif
95
96 }
97 }
98
99 return 0;
100}
101
102/**
103 * Initialize all USB controllers attached to PCI.
104 */
105int
106usb_initialize (void)
107{
108 int bus, dev, func;
109 for (bus = 0; bus < 256; bus++)
110 for (dev = 0; dev < 32; dev++)
111 for (func = 0; func < 8; func++)
112 usb_controller_initialize (bus, dev, func);
113 return 0;
114}
115
116int
117usb_exit (void)
118{
119 return 0;
120}