mirror of
https://github.com/KytyPS5/KytyPS5.git
synced 2026-10-22 20:06:54 +02:00
agc: encode acquire-memory byte ranges in standard packets
This commit is contained in:
+13
-39
@@ -3022,39 +3022,8 @@ uint32_t* KYTY_SYSV_ABI AgcDcbAcquireMem(CommandBuffer* buf, uint8_t engine, uin
|
||||
engine, cb_db_op, gcr_cntl, reinterpret_cast<uint64_t>(base), size_bytes, poll_cycles);
|
||||
}
|
||||
|
||||
bool no_size = (static_cast<int64_t>(size_bytes) == -1);
|
||||
auto vaddr = reinterpret_cast<uint64_t>(base);
|
||||
|
||||
EXIT_NOT_IMPLEMENTED(buf == nullptr);
|
||||
|
||||
static std::atomic<uint32_t> warning_log_count {0};
|
||||
const bool log_warning = (warning_log_count.fetch_add(1) < 64);
|
||||
if (!no_size && (size_bytes & 0xffu) != 0) {
|
||||
if (log_warning) {
|
||||
LOGF_COLOR(Log::Color::Red, "\t warning: size_bytes is not 256-byte aligned\n");
|
||||
}
|
||||
}
|
||||
if (!no_size && (size_bytes >> 40u) != 0) {
|
||||
if (log_warning) {
|
||||
LOGF_COLOR(Log::Color::Red, "\t warning: size_bytes is too large\n");
|
||||
}
|
||||
}
|
||||
if ((vaddr & 0xffu) != 0) {
|
||||
if (log_warning) {
|
||||
LOGF_COLOR(Log::Color::Red, "\t warning: base is not 256-byte aligned\n");
|
||||
}
|
||||
}
|
||||
if ((vaddr >> 40u) != 0) {
|
||||
if (log_warning) {
|
||||
LOGF_COLOR(Log::Color::Red, "\t warning: base is too high\n");
|
||||
}
|
||||
}
|
||||
if (engine > 1) {
|
||||
if (log_warning) {
|
||||
LOGF_COLOR(Log::Color::Red, "\t warning: unsupported engine 0x%02" PRIx8 "\n", engine);
|
||||
}
|
||||
}
|
||||
|
||||
auto* cmd = buf->AllocateDW(8);
|
||||
|
||||
if (cmd == nullptr) {
|
||||
@@ -3062,14 +3031,19 @@ uint32_t* KYTY_SYSV_ABI AgcDcbAcquireMem(CommandBuffer* buf, uint8_t engine, uin
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
cmd[0] = KYTY_PM4(8, Pm4::IT_NOP, Pm4::R_ACQUIRE_MEM);
|
||||
cmd[1] = (static_cast<uint32_t>(engine & 1u) << 31u) | cb_db_op;
|
||||
cmd[2] = (no_size ? 0 : static_cast<uint32_t>(size_bytes >> 8u));
|
||||
cmd[3] = 0;
|
||||
constexpr uint64_t address_mask = 0xffffffffffffull;
|
||||
const auto vaddr = reinterpret_cast<uint64_t>(base);
|
||||
// Cover the byte range in 256-byte units, bounded by the 48-bit address space.
|
||||
const auto size = std::min((((vaddr & 0xffu) + size_bytes) & address_mask) + 0xffu,
|
||||
(address_mask & ~uint64_t {0xff}) - vaddr) >> 8u;
|
||||
cmd[0] = KYTY_PM4(8, Pm4::IT_ACQUIRE_MEM, 0u);
|
||||
cmd[1] = (static_cast<uint32_t>(engine) << 31u) | (cb_db_op & 0x06007fc0u);
|
||||
cmd[2] = static_cast<uint32_t>(size);
|
||||
cmd[3] = static_cast<uint32_t>((size >> 32u) & 0xffu);
|
||||
cmd[4] = static_cast<uint32_t>(vaddr >> 8u);
|
||||
cmd[5] = 0;
|
||||
cmd[6] = poll_cycles / 40;
|
||||
cmd[7] = gcr_cntl;
|
||||
cmd[5] = static_cast<uint32_t>(vaddr >> 40u);
|
||||
cmd[6] = std::min(poll_cycles >> 4u, 0xffffu);
|
||||
cmd[7] = gcr_cntl & 0x7ffffu;
|
||||
|
||||
return cmd;
|
||||
}
|
||||
@@ -3083,7 +3057,7 @@ uint32_t KYTY_SYSV_ABI AgcDcbAcquireMemGetSize() {
|
||||
uint32_t* KYTY_SYSV_ABI AgcAcbAcquireMem(CommandBuffer* buf, uint32_t gcr_cntl,
|
||||
const volatile void* base, uint64_t size_bytes,
|
||||
uint32_t poll_cycles) {
|
||||
return AgcDcbAcquireMem(buf, 1, 0, gcr_cntl, base, size_bytes, poll_cycles);
|
||||
return AgcDcbAcquireMem(buf, 0, 0, gcr_cntl, base, size_bytes, poll_cycles);
|
||||
}
|
||||
|
||||
uint32_t KYTY_SYSV_ABI AgcAcbAcquireMemGetSize() {
|
||||
|
||||
Reference in New Issue
Block a user