int smfb_cnattach(bus_space_tag_t memt, bus_space_tag_t iot, pcitag_t tag, pcireg_t id) { long defattr; struct rasops_info *ri; bus_space_handle_t fbh, mmioh; pcireg_t bar; int rc, is5xx; /* filter out unrecognized devices */ switch (id) { default: return ENODEV; case PCI_ID_CODE(PCI_VENDOR_SMI, PCI_PRODUCT_SMI_SM712): is5xx = 0; break; case PCI_ID_CODE(PCI_VENDOR_SMI, PCI_PRODUCT_SMI_SM501): is5xx = 1; break; } smfbcn.is5xx = is5xx; bar = pci_conf_read_early(tag, PCI_MAPREG_START); if (PCI_MAPREG_TYPE(bar) != PCI_MAPREG_TYPE_MEM) return EINVAL; rc = bus_space_map(memt, PCI_MAPREG_MEM_ADDR(bar), 1 /* XXX */, BUS_SPACE_MAP_LINEAR, &fbh); if (rc != 0) return rc; if (smfbcn.is5xx) { bar = pci_conf_read_early(tag, PCI_MAPREG_START + 0x04); if (PCI_MAPREG_TYPE(bar) != PCI_MAPREG_TYPE_MEM) return EINVAL; rc = bus_space_map(memt, PCI_MAPREG_MEM_ADDR(bar), 1 /* XXX */, BUS_SPACE_MAP_LINEAR, &mmioh); if (rc != 0) return rc; } else { mmioh = fbh; } rc = smfb_setup(&smfbcn, memt, fbh, memt, mmioh); if (rc != 0) return rc; ri = &smfbcn.ri; ri->ri_ops.alloc_attr(ri, 0, 0, 0, &defattr); wsdisplay_cnattach(&smfbcn.wsd, ri, 0, 0, defattr); return 0; }
/* * Try to figure out what particular machine we run on, depending on the * scarce PMON version information and whatever else we can figure. */ const struct platform * loongson_identify(const char *version, int envtype) { const struct bonito_flavour *f; switch (envtype) { case PMON_ENVTYPE_EFI: return NULL; break; default: case PMON_ENVTYPE_ENVP: if (version == NULL) { /* * If there is no `Version' variable, we expect to be * running on a 2E system, use the generic code and * hope for the best. */ if (loongson_ver == 0x2e) { return &generic2e_platform; } else { pmon_printf("Unable to figure out model!\n"); return NULL; } } for (f = bonito_flavours; f->prefix != NULL; f++) if (strncmp(version, f->prefix, strlen(f->prefix)) == 0) return f->platform; /* * Early Lemote designs shipped without a model prefix. * * We can reasonably expect these to be close enough to either * the first generation Fuloong 2F design (LM6002), or the 7 * inch first netbook model; we can tell them apart by looking * at which video chip they embed. * * Note that this is only worth doing if the version string is * 1.2.something (1.3 onwards are expected to have a model * prefix, and there are currently no reports of 1.1 and * below being 2F systems). * * LM6002 users are encouraged to add the system model prefix to * the `Version' variable. */ if (strncmp(version, "1.2.", 4) == 0) { const struct platform *p = NULL; pcitag_t tag; pcireg_t id, class; int dev; pmon_printf("No model prefix " "in version string \"%s\".\n", version); if (loongson_ver == 0x2f) for (dev = 0; dev < 32; dev++) { tag = pci_make_tag_early(0, dev, 0); id = pci_conf_read_early(tag, PCI_ID_REG); if (id == 0 || PCI_VENDOR(id) == PCI_VENDOR_INVALID) continue; /* * No need to check for * DEVICE_IS_VGA_PCI here, since we * expect a linear framebuffer. */ class = pci_conf_read_early(tag, PCI_CLASS_REG); if (PCI_CLASS(class) != PCI_CLASS_DISPLAY || (PCI_SUBCLASS(class) != PCI_SUBCLASS_DISPLAY_VGA && PCI_SUBCLASS(class) != PCI_SUBCLASS_DISPLAY_MISC)) continue; switch (id) { case PCI_ID_CODE(PCI_VENDOR_SIS, PCI_PRODUCT_SIS_315PRO_VGA): p = &fuloong_platform; break; case PCI_ID_CODE(PCI_VENDOR_SMI, PCI_PRODUCT_SMI_SM712): p = &ebenton_platform; break; } } if (p != NULL) { pmon_printf("Attempting to match as " "%s %s\n", p->vendor, p->product); return p; } } } pmon_printf("This kernel doesn't support model \"%s\"." "\n", version); return NULL; }