summaryrefslogtreecommitdiffstats
path: root/loader2/hardware.c
diff options
context:
space:
mode:
Diffstat (limited to 'loader2/hardware.c')
-rw-r--r--loader2/hardware.c189
1 files changed, 189 insertions, 0 deletions
diff --git a/loader2/hardware.c b/loader2/hardware.c
new file mode 100644
index 000000000..ec694d1dd
--- /dev/null
+++ b/loader2/hardware.c
@@ -0,0 +1,189 @@
+/*
+ * hardware.c - various hardware probing functionality
+ *
+ * Erik Troan <ewt@redhat.com>
+ * Matt Wilson <msw@redhat.com>
+ * Michael Fulbright <msf@redhat.com>
+ * Jeremy Katz <katzj@redhat.com>
+ *
+ * Copyright 1997 - 2002 Red Hat, Inc.
+ *
+ * This software may be freely redistributed under the terms of the GNU
+ * General Public License.
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <fcntl.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "loader.h"
+#include "hardware.h"
+#include "log.h"
+
+/* JKFIXME: this is the same hack as in loader.c for second stage modules */
+extern struct moduleBallLocation * secondStageModuleLocation;
+
+static int detectHardware(moduleInfoSet modInfo,
+ char *** modules, int flags) {
+ struct device ** devices, ** device;
+ char ** modList;
+ int numMods;
+ char *driver;
+
+ logMessage("probing buses");
+
+ devices = probeDevices(CLASS_UNSPEC,
+ BUS_PCI | BUS_SBUS,
+ PROBE_ALL);
+
+ logMessage("finished bus probing");
+
+ if (devices == NULL) {
+ *modules = NULL;
+ return LOADER_OK;
+ }
+
+ numMods = 0;
+ for (device = devices; *device; device++) numMods++;
+
+ if (!numMods) {
+ *modules = NULL;
+ return LOADER_OK;
+ }
+
+ modList = malloc(sizeof(*modList) * (numMods + 1));
+ numMods = 0;
+
+ for (device = devices; *device; device++) {
+ driver = (*device)->driver;
+ if (strcmp (driver, "ignore") && strcmp (driver, "unknown")
+ && strcmp (driver, "disabled")) {
+ modList[numMods++] = strdup(driver);
+ }
+
+ freeDevice (*device);
+ }
+
+ modList[numMods] = NULL;
+ *modules = modList;
+
+ free(devices);
+
+ return LOADER_OK;
+}
+
+int agpgartInitialize(moduleList modLoaded, moduleDeps modDeps,
+ moduleInfoSet modInfo, int flags) {
+ struct device ** devices, *p;
+ int i;
+
+ if (FL_TESTING(flags)) return 0;
+
+ logMessage("looking for video cards requiring agpgart module");
+
+ devices = probeDevices(CLASS_VIDEO, BUS_UNSPEC, PROBE_ALL);
+
+ if (!devices) {
+ logMessage("no video cards found");
+ return 0;
+ }
+
+ /* loop thru cards, see if we need agpgart */
+ for (i=0; devices[i]; i++) {
+ p = devices[i];
+ logMessage("found video card controller %s", p->driver);
+
+ /* HACK - need to have list of cards which match!! */
+ /* JKFIXME: verify this is really still needed */
+ if (!strcmp(p->driver, "Card:Intel 810") ||
+ !strcmp(p->driver, "Card:Intel 815")) {
+ logMessage("found %s card requiring agpgart, loading module",
+ p->driver+5);
+
+ if (mlLoadModuleSetLocation("agpgart", modLoaded, modDeps,
+ modInfo, flags,
+ secondStageModuleLocation)) {
+ logMessage("failed to insert agpgart module");
+ return 1;
+ } else {
+ /* only load it once! */
+ return 0;
+ }
+ }
+ }
+
+ return 0;
+}
+
+/* This loads the necessary parallel port drivers for printers so that
+ kudzu can autodetect and setup printers in post install*/
+void initializeParallelPort(moduleList modLoaded, moduleDeps modDeps,
+ moduleInfoSet modInfo, int flags) {
+ /* JKFIXME: this can be used on other arches too... */
+#if !defined (__i386__)
+ return;
+#endif
+ if (FL_NOPARPORT(flags)) return;
+
+ logMessage("loading parallel port drivers...");
+ if (mlLoadModuleSetLocation("parport_pc", modLoaded, modDeps,
+ modInfo, flags,
+ secondStageModuleLocation)) {
+ logMessage("failed to load parport_pc module");
+ return;
+ }
+}
+
+int busProbe(moduleInfoSet modInfo, moduleList modLoaded, moduleDeps modDeps,
+ int justProbe, struct knownDevices * kd, int flags) {
+ int i;
+ char ** modList;
+ char modules[1024];
+
+ if (FL_NOPROBE(flags)) return 0;
+
+ if (!access("/proc/bus/pci/devices", R_OK) ||
+ !access("/proc/openprom", R_OK)) {
+ /* autodetect whatever we can */
+ if (detectHardware(modInfo, &modList, flags)) {
+ logMessage("failed to scan pci bus!");
+ return 0;
+ } else if (modList && justProbe) {
+ for (i = 0; modList[i]; i++)
+ printf("%s\n", modList[i]);
+ } else if (modList) {
+ *modules = '\0';
+
+ for (i = 0; modList[i]; i++) {
+ if (i) strcat(modules, ":");
+ strcat(modules, modList[i]);
+ }
+
+ mlLoadModuleSet(modules, modLoaded, modDeps, modInfo, flags);
+
+ kdFindScsiList(kd, 0);
+ kdFindNetList(kd, 0);
+ } else
+ logMessage("found nothing");
+ }
+
+ return 0;
+}
+
+
+void scsiSetup(moduleList modLoaded, moduleDeps modDeps,
+ moduleInfoSet modInfo, int flags,
+ struct knownDevices * kd) {
+ mlLoadModuleSet("sd_mod:sr_mod", modLoaded, modDeps, modInfo, flags);
+}
+
+void ideSetup(moduleList modLoaded, moduleDeps modDeps,
+ moduleInfoSet modInfo, int flags,
+ struct knownDevices * kd) {
+ mlLoadModuleSet("ide-cd", modLoaded, modDeps, modInfo, flags);
+}