#include "PR/os_internal.h"
#include "PR/ultraerror.h"
#include "PR/rcp.h"
#include "PRinternal/osint.h"

// TODO: this comes from a header
#ident "$Revision: 1.17 $"

s32 osDpSetNextBuffer(void* bufPtr, u64 size) {
    register u32 stat;

#ifdef _DEBUG
    if ((u32)bufPtr & 0x7) {
        __osError(ERR_OSDPSETNEXTBUFFER_ADDR, 1, bufPtr);
        return -1;
    }
    if (size & 0x7) {
        __osError(ERR_OSDPSETNEXTBUFFER_SIZE, 1, size);
        return -1;
    }
#endif

    if (__osDpDeviceBusy()) {
        return -1;
    }

    IO_WRITE(DPC_STATUS_REG, DPC_CLR_XBUS_DMEM_DMA);

    while (TRUE) {
        stat = IO_READ(DPC_STATUS_REG);
        if ((stat & DPC_STATUS_XBUS_DMEM_DMA) == 0) {
            break;
        }
    }

    IO_WRITE(DPC_START_REG, osVirtualToPhysical(bufPtr));
    IO_WRITE(DPC_END_REG, osVirtualToPhysical(bufPtr) + size);
    return 0;
}
