static void handle_features(struct cpu_user_regs *regs)
{
- struct domain *d = current->domain;
- struct ffa_ctx *ctx = d->arch.tee;
uint32_t a1 = get_user_reg(regs, 1);
unsigned int n;
ffa_set_regs_success(regs, 0, 0);
break;
case FFA_FEATURE_NOTIF_PEND_INTR:
- if ( ctx->notif.enabled )
- ffa_set_regs_success(regs, GUEST_FFA_NOTIF_PEND_INTR_ID, 0);
- else
- ffa_set_regs_error(regs, FFA_RET_NOT_SUPPORTED);
+ ffa_set_regs_success(regs, GUEST_FFA_NOTIF_PEND_INTR_ID, 0);
break;
case FFA_FEATURE_SCHEDULE_RECV_INTR:
- if ( ctx->notif.enabled )
- ffa_set_regs_success(regs, GUEST_FFA_SCHEDULE_RECV_INTR_ID, 0);
- else
- ffa_set_regs_error(regs, FFA_RET_NOT_SUPPORTED);
+ ffa_set_regs_success(regs, GUEST_FFA_SCHEDULE_RECV_INTR_ID, 0);
break;
case FFA_NOTIFICATION_BIND:
case FFA_NOTIFICATION_SET:
case FFA_NOTIFICATION_INFO_GET_32:
case FFA_NOTIFICATION_INFO_GET_64:
- if ( ctx->notif.enabled )
- ffa_set_regs_success(regs, 0, 0);
- else
- ffa_set_regs_error(regs, FFA_RET_NOT_SUPPORTED);
+ ffa_set_regs_success(regs, 0, 0);
break;
default:
ffa_set_regs_error(regs, FFA_RET_NOT_SUPPORTED);
int ffa_notif_domain_init(struct domain *d)
{
- struct ffa_ctx *ctx = d->arch.tee;
int32_t res;
if ( !notif_enabled )
if ( res )
return -ENOMEM;
- ctx->notif.enabled = true;
-
return 0;
}
void ffa_notif_domain_destroy(struct domain *d)
{
- struct ffa_ctx *ctx = d->arch.tee;
-
- if ( ctx->notif.enabled )
- {
+ /*
+ * Call bitmap_destroy even if bitmap create failed as the SPMC will
+ * return a DENIED error that we will ignore.
+ */
+ if ( notif_enabled )
ffa_notification_bitmap_destroy(ffa_get_vm_id(d));
- ctx->notif.enabled = false;
- }
}