# GSP Error Codes ## Standard POSIX Errors (Negative Return Values) | Code | Hex | Name | Description | |------|-----|------|-------------| | 0 | 0x00000000 | OK | Success | | -1 | 0xFFFFFFFF | EPERM | Operation not permitted | | -2 | 0xFFFFFFFE | ENOENT | No such file/entry | | -3 | 0xFFFFFFFD | EINVAL | Invalid argument | | -6 | 0xFFFFFFFA | ENODEV | No such device | | -12 | 0xFFFFFFF4 | ENOMEM | Out of memory | | -16 | 0xFFFFFFEE | EBUSY | Device/resource busy | | -22 | 0xFFFFFFEA | EINVAL | Invalid argument | | -28 | 0xFFFFFFE4 | ENOSPC | No space left on device | | -37 | 0xFFFFFFDB | ENOLCK | No locks available | | -56 | 0xFFFFFFC8 | EBADMSG | Bad message | | -84 | 0xFFFFFFAC | EOVERFLOW | Value too large | | -90 | 0xFFFFA6 | ENOSTR | Not a stream | | -91 | 0xFFFFA5 | ENODATA | No data available | | -94 | 0xFFFFA2 | ENOSR | Out of streams resources | | -97 | 0xFFFFFF9F | EPROTO | Protocol error | | -111 | 0xFFFFFF91 | ETIMEDOUT | Connection timed out | ## GSP-Specific Error Codes (Observed in Firmware) ### Memory Errors | Code | Hex | Name | Description | |------|-----|------|-------------| | 0x1E | 0x0000001E | ETIME | WPR/RPC timeout | | 0x1F | 0x0000001F | EDEV | Device error | | 0x25 | 0x00000025 | EOVERFLOW | Region/offset overflow | | 0x37 | 0x00000037 | EINVAL | Invalid alignment/size | | 0x51 | 0x00000051 | ENOMEM | Allocator exhausted | | 0x56 | 0x00000056 | EBUSY | Resource busy | | 0xFFFF | 0xFFFFFFFF | EPERM | Permission denied | ### RPC Errors | Code | Hex | Name | Description | |------|-----|------|-------------| | 0x1D | 0x0000001D | EFAULT | Bad address in RPC | | 0x1E | 0x0000001E | ETIMEDOUT | RPC timeout | | 0x1F | 0x0000001F | EPROTO | Protocol violation | | 0x20 | 0x00000020 | EBADRPC | Invalid RPC type | | 0x21 | 0x00000021 | EBADSEQ | Sequence mismatch | | 0x22 | 0x00000022 | EBADSIZE | Payload size error | ### BAR Errors | Code | Hex | Name | Description | |------|-----|------|-------------| | 0x30 | 0x00000030 | EBARINVAL | Invalid BAR index | | 0x31 | 0x00000031 | EBARPERM | BAR access denied | | 0x32 | 0x00000032 | EBARSIZE | Aperture size error | | 0x33 | 0x00000033 | EBARALIGN | Alignment error | | 0x34 | 0x00000034 | EBARRANGE | Offset out of range | | 0x35 | 0x00000035 | EBARBUSY | BAR busy | ### WPR Errors | Code | Hex | Name | Description | |------|-----|------|-------------| | 0x40 | 0x00000040 | EWPRINVAL | Invalid WPR region | | 0x41 | 0x00000041 | EWPRPERM | WPR permission denied | | 0x42 | 0x00000042 | EWPROVERLAP | Overlapping WPR regions | | 0x43 | 0x00000043 | EWPRBUSY | WPR operation in progress | | 0x44 | 0x00000044 | EWPRTIMEOUT | WPR timeout | ### Migration Errors | Code | Hex | Name | Description | |------|-----|------|-------------| | 0x50 | 0x00000050 | EMIGINVAL | Invalid migration phase | | 0x51 | 0x00000051 | EMIGNOMEM | Migration buffer OOM | | 0x52 | 0x00000052 | EMIGBUSY | Migration in progress | | 0x53 | 0x00000053 | EMIGPHASE | Phase mismatch | | 0x54 | 0x00000054 | EMIGVERIFY | Verification failed | | 0x55 | 0x00000055 | EMIGCOMMIT | Commit failed | | 0x56 | 0x00000056 | EMIGABORT | Migration aborted | ### Scheduler Errors | Code | Hex | Name | Description | |------|-----|------|-------------| | 0x60 | 0x00000060 | ESCHINVAL | Invalid schedule params | | 0x61 | 0x00000061 | ESCHPRIO | Priority error | | 0x62 | 0x00000062 | ESCHYIELD | Yield failed | | 0x63 | 0x00000063 | ESCHPREEMPT | Preemption error | ### Notification Errors | Code | Hex | Name | Description | |------|-----|------|-------------| | 0x70 | 0x00000070 | ENOTIFYINVAL | Invalid notification | | 0x71 | 0x00000071 | ENOTIFYBUSY | Notification queue full | | 0x72 | 0x00000072 | ENOTIFYDROP | Notification dropped | ## Error Code Mapping (Kernel Driver) ```c static int gsp_errno_to_errno(int gsp_err) { switch (gsp_err) { case 0: return 0; case -1: return -EPERM; case -2: return -ENOENT; case -3: return -EINVAL; case -6: return -ENODEV; case -12: return -ENOMEM; case -16: return -EBUSY; case -22: return -EINVAL; case -28: return -ENOSPC; case -37: return -ENOLCK; case -56: return -EBADMSG; case -84: return -EOVERFLOW; case -90: return -ENOSTR; case -91: return -ENODATA; case -94: return -ENOSR; case -97: return -EPROTO; case -111: return -ETIMEDOUT; // GSP-specific case 0x1E: return -ETIMEDOUT; case 0x1F: return -EIO; case 0x25: return -EOVERFLOW; case 0x37: return -EINVAL; case 0x51: return -ENOMEM; case 0x56: return -EBUSY; case 0xFFFF: return -EPERM; // BAR case 0x30: return -EINVAL; case 0x31: return -EPERM; case 0x32: return -EINVAL; case 0x33: return -EINVAL; case 0x34: return -ERANGE; case 0x35: return -EBUSY; // WPR case 0x40: return -EINVAL; case 0x41: return -EPERM; case 0x42: return -EEXIST; case 0x43: return -EBUSY; case 0x44: return -ETIMEDOUT; // Migration case 0x50: return -EINVAL; case 0x51: return -ENOMEM; case 0x52: return -EBUSY; case 0x53: return -EINVAL; case 0x54: return -EIO; case 0x55: return -EIO; case 0x56: return -ECANCELED; // Scheduler case 0x60: return -EINVAL; case 0x61: return -EINVAL; case 0x62: return -EAGAIN; case 0x63: return -EAGAIN; // Notification case 0x70: return -EINVAL; case 0x71: return -EAGAIN; case 0x72: return -ENOBUFS; default: return -EIO; } } ``` ## Debugging Error Codes ### GSP Log Format ``` GSP_ERROR: rpc_type=0x0A seq=0x1234 err=0x31 (EBARPERM) vf=2 addr=0x7F000000 ``` ### Common Error Scenarios | Scenario | Error Code | Resolution | |----------|------------|------------| | VF writes to unmapped BAR | 0x31 (EBARPERM) | Check VF BAR config | | Migration verify fails | 0x54 (EMIGVERIFY) | Check memory integrity | | WPR timeout on page fault | 0x44 (EWPRTIMEOUT) | Increase timeout | | RPC sequence mismatch | 0x21 (EBADSEQ) | Reset RPC client | | Allocator exhausted | 0x51 (ENOMEM) | Free unused VF memory | | BAR aperture too small | 0x32 (EBARSIZE) | Increase aperture | ### Error Injection (Testing) ```c // Inject errors for testing #define GSP_INJECT_ERROR(rpc_type, err_code) \ gsp_test_inject_error(gsp, rpc_type, err_code) void gsp_test_inject_error(struct gsp_device *gsp, uint32_t rpc_type, int err_code) { struct inject_payload p = { .rpc_type = rpc_type, .error_code = err_code, .enable = 1, }; gsp_rpc_send_sync(gsp->rpc, RPC_DEBUG, &p, sizeof(p), NULL, NULL); } ```