Commit 6d0ef321 authored by Umang Jain's avatar Umang Jain Committed by Greg Kroah-Hartman
Browse files

staging: vc04_services: Move global memory mapped pointer



g_regs stores the remapped memory pointer for the vchiq platform.
It can be moved to struct vchiq_drv_mgmt instead of being global.

Adjust the affected functions accordingly. Pass vchiq_state pointer
wherever necessary to access struct vchiq_drv_mgmt.

Reviewed-by: default avatarLaurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: default avatarUmang Jain <umang.jain@ideasonboard.com>
Link: https://lore.kernel.org/r/20240412075743.60712-8-umang.jain@ideasonboard.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 39fbff9d
Loading
Loading
Loading
Loading
+11 −8
Original line number Diff line number Diff line
@@ -129,8 +129,6 @@ struct vchiq_pagelist_info {
	unsigned int scatterlist_mapped;
};

static void __iomem *g_regs;

static int
vchiq_blocking_bulk_transfer(struct vchiq_instance *instance, unsigned int handle, void *data,
			     unsigned int size, enum vchiq_bulk_dir dir);
@@ -139,11 +137,14 @@ static irqreturn_t
vchiq_doorbell_irq(int irq, void *dev_id)
{
	struct vchiq_state *state = dev_id;
	struct vchiq_drv_mgmt *mgmt;
	irqreturn_t ret = IRQ_NONE;
	unsigned int status;

	mgmt = dev_get_drvdata(state->dev);

	/* Read (and clear) the doorbell */
	status = readl(g_regs + BELL0);
	status = readl(mgmt->regs + BELL0);

	if (status & ARM_DS_ACTIVE) {  /* Was the doorbell rung? */
		remote_event_pollall(state);
@@ -556,9 +557,9 @@ static int vchiq_platform_init(struct platform_device *pdev, struct vchiq_state
	if (err)
		return err;

	g_regs = devm_platform_ioremap_resource(pdev, 0);
	if (IS_ERR(g_regs))
		return PTR_ERR(g_regs);
	drv_mgmt->regs = devm_platform_ioremap_resource(pdev, 0);
	if (IS_ERR(drv_mgmt->regs))
		return PTR_ERR(drv_mgmt->regs);

	irq = platform_get_irq(pdev, 0);
	if (irq <= 0)
@@ -641,8 +642,10 @@ static struct vchiq_arm_state *vchiq_platform_get_arm_state(struct vchiq_state *
}

void
remote_event_signal(struct remote_event *event)
remote_event_signal(struct vchiq_state *state, struct remote_event *event)
{
	struct vchiq_drv_mgmt *mgmt = dev_get_drvdata(state->dev);

	/*
	 * Ensure that all writes to shared data structures have completed
	 * before signalling the peer.
@@ -654,7 +657,7 @@ remote_event_signal(struct remote_event *event)
	dsb(sy);         /* data barrier operation */

	if (event->armed)
		writel(0, g_regs + BELL2); /* trigger vc interrupt */
		writel(0, mgmt->regs + BELL2); /* trigger vc interrupt */
}

int
+2 −0
Original line number Diff line number Diff line
@@ -50,6 +50,8 @@ struct vchiq_drv_mgmt {
	char *fragments_base;
	char *free_fragments;
	unsigned int fragments_size;

	void __iomem *regs;
};

struct user_service {
+5 −5
Original line number Diff line number Diff line
@@ -691,7 +691,7 @@ reserve_space(struct vchiq_state *state, size_t space, int is_blocking)
			/* But first, flush through the last slot. */
			state->local_tx_pos = tx_pos;
			local->tx_pos = tx_pos;
			remote_event_signal(&state->remote->trigger);
			remote_event_signal(state, &state->remote->trigger);

			if (!is_blocking ||
			    (wait_for_completion_interruptible(&state->slot_available_event)))
@@ -1124,7 +1124,7 @@ queue_message(struct vchiq_state *state, struct vchiq_service *service,
	if (!(flags & QMFLAGS_NO_MUTEX_UNLOCK))
		mutex_unlock(&state->slot_mutex);

	remote_event_signal(&state->remote->trigger);
	remote_event_signal(state, &state->remote->trigger);

	return 0;
}
@@ -1202,7 +1202,7 @@ queue_message_sync(struct vchiq_state *state, struct vchiq_service *service,
		&svc_fourcc, VCHIQ_MSG_SRCPORT(msgid),
		VCHIQ_MSG_DSTPORT(msgid), size);

	remote_event_signal(&state->remote->sync_trigger);
	remote_event_signal(state, &state->remote->sync_trigger);

	if (VCHIQ_MSG_TYPE(msgid) != VCHIQ_MSG_PAUSE)
		mutex_unlock(&state->sync_mutex);
@@ -1260,7 +1260,7 @@ release_slot(struct vchiq_state *state, struct vchiq_slot_info *slot_info,
		 * A write barrier is necessary, but remote_event_signal
		 * contains one.
		 */
		remote_event_signal(&state->remote->recycle);
		remote_event_signal(state, &state->remote->recycle);
	}

	mutex_unlock(&state->recycle_mutex);
@@ -3240,7 +3240,7 @@ static void
release_message_sync(struct vchiq_state *state, struct vchiq_header *header)
{
	header->msgid = VCHIQ_MSGID_PADDING;
	remote_event_signal(&state->remote->sync_release);
	remote_event_signal(state, &state->remote->sync_release);
}

int
+1 −1
Original line number Diff line number Diff line
@@ -516,7 +516,7 @@ int vchiq_prepare_bulk_data(struct vchiq_instance *instance, struct vchiq_bulk *

void vchiq_complete_bulk(struct vchiq_instance *instance, struct vchiq_bulk *bulk);

void remote_event_signal(struct remote_event *event);
void remote_event_signal(struct vchiq_state *state, struct remote_event *event);

void vchiq_dump_platform_state(struct seq_file *f);