Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d1cc1732 authored by Chris Metcalf's avatar Chris Metcalf
Browse files

arch/tile: provide kernel support for the tilegx USB shim



This change adds support for accessing the USB shim from within the
kernel.  Note that this change by itself does not allow the kernel
to act as a host or as a device; it merely exposes the built-in on-chip
hardware to the kernel.

The <arch/usb_host.h> and <arch/usb_host_def.h> headers are empty at
the moment because the kernel does not require any types or definitions
specific to the tilegx USB shim; the generic USB core code is all we need.
The headers are left in as stubs so that we don't need to modify the
hypervisor header (drv_usb_host_intf.h) from upstream.

Signed-off-by: default avatarChris Metcalf <cmetcalf@tilera.com>
parent 41bb38fc
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -21,3 +21,8 @@ config TILE_GXIO_TRIO
	bool
	bool
	select TILE_GXIO
	select TILE_GXIO
	select TILE_GXIO_DMA
	select TILE_GXIO_DMA

# Support direct access to the TILE-Gx USB hardware from kernel space.
config TILE_GXIO_USB_HOST
	bool
	select TILE_GXIO
+1 −0
Original line number Original line Diff line number Diff line
@@ -6,3 +6,4 @@ obj-$(CONFIG_TILE_GXIO) += iorpc_globals.o kiorpc.o
obj-$(CONFIG_TILE_GXIO_DMA) += dma_queue.o
obj-$(CONFIG_TILE_GXIO_DMA) += dma_queue.o
obj-$(CONFIG_TILE_GXIO_MPIPE) += mpipe.o iorpc_mpipe.o iorpc_mpipe_info.o
obj-$(CONFIG_TILE_GXIO_MPIPE) += mpipe.o iorpc_mpipe.o iorpc_mpipe_info.o
obj-$(CONFIG_TILE_GXIO_TRIO) += trio.o iorpc_trio.o
obj-$(CONFIG_TILE_GXIO_TRIO) += trio.o iorpc_trio.o
obj-$(CONFIG_TILE_GXIO_USB_HOST) += usb_host.o iorpc_usb_host.o
+99 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright 2012 Tilera Corporation. All Rights Reserved.
 *
 *   This program is free software; you can redistribute it and/or
 *   modify it under the terms of the GNU General Public License
 *   as published by the Free Software Foundation, version 2.
 *
 *   This program is distributed in the hope that it will be useful, but
 *   WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
 *   NON INFRINGEMENT.  See the GNU General Public License for
 *   more details.
 */

/* This file is machine-generated; DO NOT EDIT! */
#include "gxio/iorpc_usb_host.h"

struct cfg_interrupt_param {
	union iorpc_interrupt interrupt;
};

int gxio_usb_host_cfg_interrupt(gxio_usb_host_context_t * context, int inter_x,
				int inter_y, int inter_ipi, int inter_event)
{
	struct cfg_interrupt_param temp;
	struct cfg_interrupt_param *params = &temp;

	params->interrupt.kernel.x = inter_x;
	params->interrupt.kernel.y = inter_y;
	params->interrupt.kernel.ipi = inter_ipi;
	params->interrupt.kernel.event = inter_event;

	return hv_dev_pwrite(context->fd, 0, (HV_VirtAddr) params,
			     sizeof(*params), GXIO_USB_HOST_OP_CFG_INTERRUPT);
}

EXPORT_SYMBOL(gxio_usb_host_cfg_interrupt);

struct register_client_memory_param {
	HV_PTE pte;
	unsigned int flags;
};

int gxio_usb_host_register_client_memory(gxio_usb_host_context_t * context,
					 HV_PTE pte, unsigned int flags)
{
	struct register_client_memory_param temp;
	struct register_client_memory_param *params = &temp;

	params->pte = pte;
	params->flags = flags;

	return hv_dev_pwrite(context->fd, 0, (HV_VirtAddr) params,
			     sizeof(*params),
			     GXIO_USB_HOST_OP_REGISTER_CLIENT_MEMORY);
}

EXPORT_SYMBOL(gxio_usb_host_register_client_memory);

struct get_mmio_base_param {
	HV_PTE base;
};

int gxio_usb_host_get_mmio_base(gxio_usb_host_context_t * context, HV_PTE *base)
{
	int __result;
	struct get_mmio_base_param temp;
	struct get_mmio_base_param *params = &temp;

	__result =
	    hv_dev_pread(context->fd, 0, (HV_VirtAddr) params, sizeof(*params),
			 GXIO_USB_HOST_OP_GET_MMIO_BASE);
	*base = params->base;

	return __result;
}

EXPORT_SYMBOL(gxio_usb_host_get_mmio_base);

struct check_mmio_offset_param {
	unsigned long offset;
	unsigned long size;
};

int gxio_usb_host_check_mmio_offset(gxio_usb_host_context_t * context,
				    unsigned long offset, unsigned long size)
{
	struct check_mmio_offset_param temp;
	struct check_mmio_offset_param *params = &temp;

	params->offset = offset;
	params->size = size;

	return hv_dev_pwrite(context->fd, 0, (HV_VirtAddr) params,
			     sizeof(*params),
			     GXIO_USB_HOST_OP_CHECK_MMIO_OFFSET);
}

EXPORT_SYMBOL(gxio_usb_host_check_mmio_offset);
+91 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright 2012 Tilera Corporation. All Rights Reserved.
 *
 *   This program is free software; you can redistribute it and/or
 *   modify it under the terms of the GNU General Public License
 *   as published by the Free Software Foundation, version 2.
 *
 *   This program is distributed in the hope that it will be useful, but
 *   WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
 *   NON INFRINGEMENT.  See the GNU General Public License for
 *   more details.
 */

/*
 *
 * Implementation of USB gxio calls.
 */

#include <linux/io.h>
#include <linux/errno.h>
#include <linux/module.h>

#include <gxio/iorpc_globals.h>
#include <gxio/iorpc_usb_host.h>
#include <gxio/kiorpc.h>
#include <gxio/usb_host.h>

int gxio_usb_host_init(gxio_usb_host_context_t * context, int usb_index,
		       int is_ehci)
{
	char file[32];
	int fd;

	if (is_ehci)
		snprintf(file, sizeof(file), "usb_host/%d/iorpc/ehci",
			 usb_index);
	else
		snprintf(file, sizeof(file), "usb_host/%d/iorpc/ohci",
			 usb_index);

	fd = hv_dev_open((HV_VirtAddr) file, 0);
	if (fd < 0) {
		if (fd >= GXIO_ERR_MIN && fd <= GXIO_ERR_MAX)
			return fd;
		else
			return -ENODEV;
	}

	context->fd = fd;

	// Map in the MMIO space.
	context->mmio_base =
		(void __force *)iorpc_ioremap(fd, 0, HV_USB_HOST_MMIO_SIZE);

	if (context->mmio_base == NULL) {
		hv_dev_close(context->fd);
		return -ENODEV;
	}

	return 0;
}

EXPORT_SYMBOL_GPL(gxio_usb_host_init);

int gxio_usb_host_destroy(gxio_usb_host_context_t * context)
{
	iounmap((void __force __iomem *)(context->mmio_base));
	hv_dev_close(context->fd);

	context->mmio_base = NULL;
	context->fd = -1;

	return 0;
}

EXPORT_SYMBOL_GPL(gxio_usb_host_destroy);

void *gxio_usb_host_get_reg_start(gxio_usb_host_context_t * context)
{
	return context->mmio_base;
}

EXPORT_SYMBOL_GPL(gxio_usb_host_get_reg_start);

size_t gxio_usb_host_get_reg_len(gxio_usb_host_context_t * context)
{
	return HV_USB_HOST_MMIO_SIZE;
}

EXPORT_SYMBOL_GPL(gxio_usb_host_get_reg_len);
+26 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright 2012 Tilera Corporation. All Rights Reserved.
 *
 *   This program is free software; you can redistribute it and/or
 *   modify it under the terms of the GNU General Public License
 *   as published by the Free Software Foundation, version 2.
 *
 *   This program is distributed in the hope that it will be useful, but
 *   WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
 *   NON INFRINGEMENT.  See the GNU General Public License for
 *   more details.
 */

/* Machine-generated file; do not edit. */

#ifndef __ARCH_USB_HOST_H__
#define __ARCH_USB_HOST_H__

#include <arch/abi.h>
#include <arch/usb_host_def.h>

#ifndef __ASSEMBLER__
#endif /* !defined(__ASSEMBLER__) */

#endif /* !defined(__ARCH_USB_HOST_H__) */
Loading