|
@@ -1136,6 +1136,7 @@ static int atom_execute_table_locked(struct atom_context *ctx, int index, uint32
|
|
|
int len, ws, ps, ptr;
|
|
|
unsigned char op;
|
|
|
atom_exec_context ectx;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
if (!base)
|
|
|
return -EINVAL;
|
|
@@ -1168,7 +1169,8 @@ static int atom_execute_table_locked(struct atom_context *ctx, int index, uint32
|
|
|
if (ectx.abort) {
|
|
|
DRM_ERROR("atombios stuck executing %04X (len %d, WS %d, PS %d) @ 0x%04X\n",
|
|
|
base, len, ws, ps, ptr - 1);
|
|
|
- return -EINVAL;
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto free;
|
|
|
}
|
|
|
|
|
|
if (op < ATOM_OP_CNT && op > 0)
|
|
@@ -1183,9 +1185,10 @@ static int atom_execute_table_locked(struct atom_context *ctx, int index, uint32
|
|
|
debug_depth--;
|
|
|
SDEBUG("<<\n");
|
|
|
|
|
|
+free:
|
|
|
if (ws)
|
|
|
kfree(ectx.ws);
|
|
|
- return 0;
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
int atom_execute_table(struct atom_context *ctx, int index, uint32_t * params)
|