Exemple #1
0
static int
rtaspci_attach(device_t dev)
{
	struct		rtaspci_softc *sc;

	sc = device_get_softc(dev);

	sc->read_pci_config = rtas_token_lookup("read-pci-config");
	sc->write_pci_config = rtas_token_lookup("write-pci-config");
	sc->ex_read_pci_config = rtas_token_lookup("ibm,read-pci-config");
	sc->ex_write_pci_config = rtas_token_lookup("ibm,write-pci-config");

	sc->sc_extended_config = 0;
	OF_getprop(ofw_bus_get_node(dev), "ibm,pci-config-space-type",
	    &sc->sc_extended_config, sizeof(sc->sc_extended_config));

	bus_dma_tag_create(bus_get_dma_tag(dev),
	    1, 0, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR,
	    NULL, NULL, BUS_SPACE_MAXSIZE, BUS_SPACE_UNRESTRICTED,
	    BUS_SPACE_MAXSIZE, 0, NULL, NULL, &sc->dma_tag);
#ifdef __powerpc64__
	if (!(mfmsr() & PSL_HV))
		phyp_iommu_set_dma_tag(dev, dev, sc->dma_tag);
#endif

	return (ofw_pci_attach(dev));
}
Exemple #2
0
static int
rtas_gettime(device_t dev, struct timespec *ts) {
    struct clocktime ct;
    cell_t tod[8];
    cell_t token;
    int error;

    token = rtas_token_lookup("get-time-of-day");
    if (token == -1)
        return (ENXIO);
    error = rtas_call_method(token, 0, 8, &tod[0], &tod[1], &tod[2],
                             &tod[3], &tod[4], &tod[5], &tod[6], &tod[7]);
    if (error < 0)
        return (ENXIO);
    if (tod[0] != 0)
        return ((tod[0] == -1) ? ENXIO : EAGAIN);

    ct.year = tod[1];
    ct.mon  = tod[2];
    ct.day  = tod[3];
    ct.hour = tod[4];
    ct.min  = tod[5];
    ct.sec  = tod[6];
    ct.nsec = tod[7];

    return (clock_ct_to_ts(&ct, ts));
}
Exemple #3
0
static int
rtaspci_attach(device_t dev)
{
    struct		rtaspci_softc *sc;

    sc = device_get_softc(dev);

    sc->read_pci_config = rtas_token_lookup("read-pci-config");
    sc->write_pci_config = rtas_token_lookup("write-pci-config");
    sc->ex_read_pci_config = rtas_token_lookup("ibm,read-pci-config");
    sc->ex_write_pci_config = rtas_token_lookup("ibm,write-pci-config");

    sc->sc_extended_config = 0;
    OF_getprop(ofw_bus_get_node(dev), "ibm,pci-config-space-type",
               &sc->sc_extended_config, sizeof(sc->sc_extended_config));

    return (ofw_pci_attach(dev));
}
Exemple #4
0
static void
rtas_shutdown(void *arg, int howto)
{
    cell_t token, status;

    if (howto & RB_HALT) {
        token = rtas_token_lookup("power-off");
        if (token == -1)
            return;

        rtas_call_method(token, 2, 1, 0, 0, &status);
    } else {
        token = rtas_token_lookup("system-reboot");
        if (token == -1)
            return;

        rtas_call_method(token, 0, 1, &status);
    }
}
Exemple #5
0
static int
rtasdev_attach(device_t dev)
{
    if (rtas_token_lookup("get-time-of-day") != -1)
        clock_register(dev, 2000);

    EVENTHANDLER_REGISTER(shutdown_final, rtas_shutdown, NULL,
                          SHUTDOWN_PRI_LAST);

    return (0);
}
Exemple #6
0
static int
rtas_settime(device_t dev, struct timespec *ts)
{
    struct clocktime ct;
    cell_t token, status;
    int error;

    token = rtas_token_lookup("set-time-of-day");
    if (token == -1)
        return (ENXIO);

    clock_ts_to_ct(ts, &ct);
    error = rtas_call_method(token, 7, 1, ct.year, ct.mon, ct.day, ct.hour,
                             ct.min, ct.sec, ct.nsec, &status);
    if (error < 0)
        return (ENXIO);
    if (status != 0)
        return (((int)status < 0) ? ENXIO : EAGAIN);

    return (0);
}
Exemple #7
0
static int
chrp_smp_start_cpu(platform_t plat, struct pcpu *pc)
{
	cell_t start_cpu;
	int result, err, timeout;

	if (!rtas_exists()) {
		printf("RTAS uninitialized: unable to start AP %d\n",
		    pc->pc_cpuid);
		return (ENXIO);
	}

	start_cpu = rtas_token_lookup("start-cpu");
	if (start_cpu == -1) {
		printf("RTAS unknown method: unable to start AP %d\n",
		    pc->pc_cpuid);
		return (ENXIO);
	}

	ap_pcpu = pc;
	powerpc_sync();

	result = rtas_call_method(start_cpu, 3, 1, pc->pc_cpuid, EXC_RST, pc,
	    &err);
	if (result < 0 || err != 0) {
		printf("RTAS error (%d/%d): unable to start AP %d\n",
		    result, err, pc->pc_cpuid);
		return (ENXIO);
	}

	timeout = 10000;
	while (!pc->pc_awake && timeout--)
		DELAY(100);

	return ((pc->pc_awake) ? 0 : EBUSY);
}