// SPDX-License-Identifier: GPL-2.0 /* * GXP doorbell interface. * * Copyright (C) 2020 Google LLC */ #include #include "gxp-doorbell.h" #include "gxp-internal.h" #define GXP_DOORBELL_STRIDE (GXP_REG_DOORBELL_1_STATUS \ - GXP_REG_DOORBELL_0_STATUS) void gxp_doorbell_enable_for_core(struct gxp_dev *gxp, u32 doorbell_num, uint core) { u32 val; /* Enable DOORBELL_NUM on requested core */ val = gxp_read_32(gxp, GXP_CORE_REG_COMMON_INT_MASK_0(core)); val |= BIT(doorbell_num); gxp_write_32(gxp, GXP_CORE_REG_COMMON_INT_MASK_0(core), val); } void gxp_doorbell_set(struct gxp_dev *gxp, u32 doorbell_num) { uint offset = GXP_REG_DOORBELL_0_SET + (GXP_DOORBELL_STRIDE * doorbell_num); gxp_write_32(gxp, offset, GXP_REG_DOORBELLS_SET_WRITEMASK); } void gxp_doorbell_clear(struct gxp_dev *gxp, u32 doorbell_num) { uint offset = GXP_REG_DOORBELL_0_CLEAR + (GXP_DOORBELL_STRIDE * doorbell_num); gxp_write_32(gxp, offset, GXP_REG_DOORBELLS_CLEAR_WRITEMASK); } u32 gxp_doorbell_status(struct gxp_dev *gxp, u32 doorbell_num) { uint offset = GXP_REG_DOORBELL_0_STATUS + (GXP_DOORBELL_STRIDE * doorbell_num); return gxp_read_32(gxp, offset); }