/dev/bsp/PPC
PPC is the /dev/bsp entity responsible for managing the PowerPC cores in the Espresso. Depending on hardware version[check], PPC either has one instance or three instances, one for each PowerPC core.
Attributes
Exe
Availability: This attribute is only available on the first instance (index 0).
Permissions: BSP_PERMISSIONS_IOS_SUPV only.
| Method | Data Size | Values | |
|---|---|---|---|
| Write | 1 | 1, 2 | Writing a 1 calls the hardware-specific method to stop execution of the PowerPC, while writing 2 does the same to start it. | 
//start the PowerPC
int8_t start = 2;
bspWrite("PPC", 0, "Exe", 1, &start);
//stop the PowerPC
int8_t stop = 1;
bspWrite("PPC", 0, "Exe", 1, &stop);Clock
Availability: This attribute is only available on the first instance (index 0).
Permissions: BSP_PERMISSIONS_IOS_SUPV only.
| Method | Data Size | Values | |
|---|---|---|---|
| Write | 1 | 1 | Writing a 1 tweaks the legacy clock registers, toggling FX and leaving the system in 162MHz/GameCube mode. Also toggles RTSB_DSKPLL, leaving it asserted. | 
EXIRegBoot
Availability: This attribute is only available on the first instance (index 0).
Permissions: BSP_PERMISSIONS_IOS_SUPV only.
| Method | Data Size | Values | |
|---|---|---|---|
| Write | 48 | see code | Enables EXI, writes up to 16 32-bit instructions to the EXI boot stub[check] and sets PPCBOOT. | 
typedef struct {
    int32_t version; //offset 0x0; must equal 3
    uint32_t instructions[16]; //actual instruction data to copy; offset 0x4
    size_t size; //size of instructions in bytes. last two bits ignored. offset 0x44
} BSP_PPC_EXIRegBootArgs;
BSP_PPC_EXIRegBootArgs args = {
    .version = 3,
    .instructions = { 0x60000000, 0x48000000 },
    .size = 2 * sizeof(uint32_t),
};
bspWrite("PPC", 0, "EXIRegBoot", sizeof(args), args);Summary
Availability: This attribute is available to all instances.
Permissions: BSP_PERMISSIONS_ALL.
| Method | Data Size | Values | |
|---|---|---|---|
| Query | 16 | see page | Returns information about the PowerPC on this board, including the core count and bus speeds. The information returned is the same for all instances. | 
typedef struct {
    uint32_t systemClockFrequency;
    uint32_t timerFrequency;
} BSP_SYSTEM_CLOCK_INFO;
typedef struct {
    uint32_t numberOfCores;
    uint32_t activeCoreBitmap; //bit 0/LSB = core 0, bit 1 = core 1, etc.
    BSP_SYSTEM_CLOCK_INFO clock60x;
} BSP_PPC_SUMMARY;
BSP_PPC_SUMMARY ppc;
bspRead("PPC", 0, "Summary", sizeof(ppc), &ppc);
printf("powerpc has %d cores\n", ppc.numberOfCores);CoreProperties
Availability: This attribute is available to all instances.
Permissions: BSP_PERMISSIONS_ALL.
| Method | Data Size | Values | |
|---|---|---|---|
| Query | 21 | see page | Returns information about the cache of a given PowerPC core. | 
typedef struct {
    uint32_t l2Size;
    uint32_t l2LineSize;
    uint32_t l2SectorSize;
    uint32_t l2FetchSize;
    uint32_t l2SetAssociativity;
    uint8_t coreActive;
} BSP_PPC_CORE_PROPERTIES;
BSP_PPC_CORE_PROPERTIES core1;
bspRead("PPC", 1, "CoreProperties", sizeof(core1), &core1);
printf("core 1 l2 cache size: %x\n", core1.l2Size);PVR
Availability: This attribute is only available on the first instance (index 0).
Permissions: BSP_PERMISSIONS_ALL.
| Method | Data Size | Values | |
|---|---|---|---|
| Read | 4 | Reads out the PVR from SEEPROM via EE. This is kept at offset 0x10 on Latte hardware, and 0x42 on Hollywood/Bollywood hardware. | |
| Write | 4 | Sets EE's first instance's control flag, then writes out the input value to 0x10 on Latte hardware, and 0x42 on Hollywood/Bollywood hardware. | 
60XeDataStreaming
Availability: This attribute is only available on the first instance (index 0), and contains a hardware version check.
Permissions: BSP_PERMISSIONS_ALL.
| Method | Data Size | Values | |
|---|---|---|---|
| Read | 1 | 0, 1 | Returns a boolean value: 0 indicates that bit 3 (mask 0x8) in LT_PIMDBG is set, while 1 indicates that bit is clear. | 
| Write | 1 | 0, 1 | Sets bit 12 (mask 0x1000) in LT_PIMDBG, which appears to be some kind of latch, sleeps, then sets mask 8 (when input is 0) or clears mask 8 (when input is 1). |