Skip to content

Commit 158d7b1

Browse files
Add Phat detection support
1 parent dd3fdb4 commit 158d7b1

3 files changed

Lines changed: 52 additions & 1 deletion

File tree

src/pspsdk.zig

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,10 @@ pub const sceJpegInitMJpeg = jpeg.init_mjpeg;
342342
// -- kermit (sceKermitPeripheral) --
343343
pub const kermit = @import("sdk/kermit.zig");
344344

345+
// -- model (Zig-only utility: PSP Phat/Slim detection) --
346+
pub const model = @import("sdk/model.zig");
347+
pub const PspModel = model.PspModel;
348+
345349
// -- kernel (LoadExecForUser, ThreadManForUser, SysMemUserForUser, ModuleMgrForUser, etc.) --
346350
pub const kernel = @import("sdk/kernel.zig");
347351
pub const sceKernelAllocPartitionMemory = kernel.alloc_partition_memory;

src/sdk/model.zig

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
//! PSP hardware model detection.
2+
//!
3+
//! Populated once at startup from kernel.max_free_mem_size(); see
4+
//! src/utils/module.zig.
5+
6+
/// PSP hardware model.
7+
pub const PspModel = enum {
8+
/// PSP-1000 ("Phat") -- 32 MB system RAM.
9+
phat,
10+
/// PSP-2000/3000/N1000 ("Slim" and later) -- 64 MB system RAM.
11+
slim,
12+
};
13+
14+
/// Threshold (bytes) used to discriminate Phat from Slim.
15+
/// Phat's hard ceiling is 32 MB of system RAM; Slim+ reports far more.
16+
/// Anything >= 32 MB free at boot must be Slim+.
17+
const slim_threshold_bytes: usize = 32 * 1024 * 1024;
18+
19+
var detected: PspModel = .phat;
20+
var boot_max_free: usize = 0;
21+
22+
/// Internal: called once during startup with the result of
23+
/// kernel.max_free_mem_size(). Not intended for user code.
24+
pub fn _set_from_max_free(bytes: usize) void {
25+
boot_max_free = bytes;
26+
detected = if (bytes >= slim_threshold_bytes) .slim else .phat;
27+
}
28+
29+
/// Returns the detected PSP model. Valid after startup runs
30+
/// (i.e. anywhere user code executes).
31+
pub fn current() PspModel {
32+
return detected;
33+
}
34+
35+
/// Returns the max-free-mem value sampled at boot, in bytes.
36+
pub fn boot_max_free_mem_size() usize {
37+
return boot_max_free;
38+
}

src/utils/module.zig

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const std = @import("std");
22

33
const kernel = @import("../sdk/kernel.zig");
4+
const model = @import("../sdk/model.zig");
45

56
const debug = @import("debug.zig");
67
const fpu = @import("fpu.zig");
@@ -40,10 +41,18 @@ pub fn _module_main_thread(argc: usize, argv: ?*anyopaque) callconv(.c) c_int {
4041
// defaults to all available memory minus a 512 KB reserve.
4142
const heap_kb: u32 = if (@hasDecl(root, "psp_heap_kb_size")) root.psp_heap_kb_size else 0;
4243
const heap_reserve: u32 = if (@hasDecl(root, "psp_heap_reserve_kb_size")) root.psp_heap_reserve_kb_size else 512;
44+
45+
// Sample max-free-mem once: it doubles as the heap sizing input AND the
46+
// discriminator for PSP Phat vs Slim+ hardware detection. Stash it in
47+
// the model module so user code can query it later via
48+
// pspsdk.model.current().
49+
const max_free = kernel.max_free_mem_size();
50+
model._set_from_max_free(max_free);
51+
4352
const heap_size: usize = if (heap_kb > 0)
4453
@as(usize, heap_kb) * 1024
4554
else
46-
kernel.max_free_mem_size() -| (@as(usize, heap_reserve) * 1024);
55+
max_free -| (@as(usize, heap_reserve) * 1024);
4756

4857
const heap_uid = kernel.alloc_partition_memory(.user, "psp_heap", .mem_low, heap_size, null) catch return 1;
4958
defer kernel.free_partition_memory(heap_uid) catch {};

0 commit comments

Comments
 (0)