pe_identify_machine.c [plain text]
#include <pexpert/protos.h>
#include <pexpert/pexpert.h>
#include <pexpert/ppc/powermac.h>
#include <pexpert/device_tree.h>
void pe_identify_machine(void)
{
DTEntry cpu, root;
unsigned long *value;
int size;
bzero((void *)&gPEClockFrequencyInfo, sizeof(clock_frequency_info_t));
gPEClockFrequencyInfo.timebase_frequency_hz = 25000000;
gPEClockFrequencyInfo.bus_clock_rate_hz = 100000000;
gPEClockFrequencyInfo.cpu_clock_rate_hz = 300000000;
if (DTFindEntry("device_type", "cpu", &cpu) == kSuccess) {
if (DTGetProperty(cpu, "timebase-frequency", (void **)&value, &size) == kSuccess) {
if (size == 8) gPEClockFrequencyInfo.timebase_frequency_hz = *(unsigned long long *)value;
else gPEClockFrequencyInfo.timebase_frequency_hz = *value;
}
gPEClockFrequencyInfo.dec_clock_rate_hz = gPEClockFrequencyInfo.timebase_frequency_hz;
if (DTGetProperty(cpu, "bus-frequency", (void **)&value, &size) == kSuccess) {
if (size == 8) gPEClockFrequencyInfo.bus_frequency_hz = *(unsigned long long *)value;
else gPEClockFrequencyInfo.bus_frequency_hz = *value;
} else {
if (DTLookupEntry(0, "/", &root) == kSuccess) {
if (DTGetProperty(root, "clock-frequency", (void **)&value, &size) == kSuccess) {
if (size == 8) gPEClockFrequencyInfo.bus_frequency_hz = *(unsigned long long *)value;
else gPEClockFrequencyInfo.bus_frequency_hz = *value;
}
}
}
gPEClockFrequencyInfo.bus_frequency_min_hz = gPEClockFrequencyInfo.bus_frequency_hz;
gPEClockFrequencyInfo.bus_frequency_max_hz = gPEClockFrequencyInfo.bus_frequency_hz;
if (gPEClockFrequencyInfo.bus_frequency_hz < 0x100000000ULL)
gPEClockFrequencyInfo.bus_clock_rate_hz = gPEClockFrequencyInfo.bus_frequency_hz;
else
gPEClockFrequencyInfo.bus_clock_rate_hz = 0xFFFFFFFF;
if (DTGetProperty(cpu, "clock-frequency", (void **)&value, &size) == kSuccess) {
if (size == 8) gPEClockFrequencyInfo.cpu_frequency_hz = *(unsigned long long *)value;
else gPEClockFrequencyInfo.cpu_frequency_hz = *value;
}
gPEClockFrequencyInfo.cpu_frequency_min_hz = gPEClockFrequencyInfo.cpu_frequency_hz;
gPEClockFrequencyInfo.cpu_frequency_max_hz = gPEClockFrequencyInfo.cpu_frequency_hz;
if (gPEClockFrequencyInfo.cpu_frequency_hz < 0x100000000ULL)
gPEClockFrequencyInfo.cpu_clock_rate_hz = gPEClockFrequencyInfo.cpu_frequency_hz;
else
gPEClockFrequencyInfo.cpu_clock_rate_hz = 0xFFFFFFFF;
}
gPEClockFrequencyInfo.timebase_frequency_num = gPEClockFrequencyInfo.timebase_frequency_hz;
gPEClockFrequencyInfo.timebase_frequency_den = 1;
gPEClockFrequencyInfo.bus_clock_rate_num = gPEClockFrequencyInfo.bus_clock_rate_hz;
gPEClockFrequencyInfo.bus_clock_rate_den = 1;
gPEClockFrequencyInfo.bus_to_cpu_rate_num =
(2 * gPEClockFrequencyInfo.cpu_clock_rate_hz) / gPEClockFrequencyInfo.bus_clock_rate_hz;
gPEClockFrequencyInfo.bus_to_cpu_rate_den = 2;
gPEClockFrequencyInfo.bus_to_dec_rate_num = 1;
gPEClockFrequencyInfo.bus_to_dec_rate_den =
gPEClockFrequencyInfo.bus_clock_rate_hz / gPEClockFrequencyInfo.dec_clock_rate_hz;
}
vm_offset_t get_io_base_addr(void)
{
DTEntry entryP;
vm_offset_t *address;
int size;
if ((DTFindEntry("device_type", "dbdma", &entryP) == kSuccess)
|| (DTFindEntry("device_type", "mac-io", &entryP) == kSuccess))
{
if (DTGetProperty(entryP, "AAPL,address", (void **)&address, &size) == kSuccess)
return *address;
if (DTGetProperty(entryP, "assigned-addresses", (void **)&address, &size) == kSuccess)
return *(address+2);
}
panic("Can't find this machine's io base address\n");
return 0;
}
vm_offset_t PE_find_scc(void)
{
vm_offset_t io, sccadd;
DTEntry entryP;
vm_offset_t *sccregs;
unsigned int sccrsize;
if(!(io = get_io_base_addr())) {
return (vm_offset_t)0;
}
sccadd = 0;
if(DTFindEntry("name", "escc-legacy", &entryP) == kSuccess) {
if (DTGetProperty(entryP, "reg", (void **)&sccregs, &sccrsize) == kSuccess) {
sccadd = ((vm_offset_t)*sccregs | io);
}
}
if(DTFindEntry("name", "escc", &entryP) == kSuccess) {
sccadd = io + 0x12000;
}
return sccadd;
}
unsigned int PE_init_taproot(vm_offset_t *taddr)
{
DTEntry entryP;
vm_offset_t *tappdata;
unsigned int tappsize;
if(DTFindEntry("name", "memory-map", &entryP) != kSuccess) return 0;
if (DTGetProperty(entryP, "TapRoot", (void **)&tappdata, &tappsize) != kSuccess) return 0;
tappdata[1] = (tappdata[1] + 4095 ) & -4096;
*taddr = io_map_spec(tappdata[0], tappdata[1]);
tappdata[0] = *taddr;
return tappdata[1];
}