/dev/bsp/PPC

From WiiUBrew
< /dev‎ | bsp
Jump to navigation Jump to search

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_60XE_CFG is set, while 1 indicates that bit is clear.
Write 1 0, 1 Sets bit 12 (mask 0x1000) in LT_60XE_CFG, which appears to be some kind of latch, sleeps, then sets bit 8 (when input is 0) or clears bit 8 (when input is 1).