-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
arch/tile: introduce GXIO IORPC framework for tilegx
The GXIO I/O RPC subsystem handles exporting I/O hardware resources to Linux and to applications running under Linux. For instance, memory which is made available for I/O DMA must be mapped by an I/O TLB; that means that such memory must be locked down by Linux, so that it is not swapped or otherwise reused, as long as those I/O TLB entries are active. Similarly, configuring direct hardware access introduces new validation requirements. If a user application registers memory, Linux must ensure that the supplied virtual addresses are valid, and turn them into client physical addresses. Similarly, when Linux then supplies those client physical addresses to the Tilera hypervisor, it must in turn validate those before turning them into the real physical addresses which are required by the hardware. To the extent that these sorts of activities were required on previous TILE architecture processors, they were implemented in a device-specific fashion. This meant that every I/O device had its own Tilera hypervisor driver, its own Linux driver, and in some cases its own user-level library support. There was a large amount of more-or-less functionally identical code in different places, particularly in the different Linux drivers. For TILE-Gx, this support has been generalized into a common framework, known as the I/O RPC framework or just IORPC. The two "gxio" directories (one for headers, one for sources) start with just a few files in each with this infrastructure commit, but after adding support for the on-board I/O shims for networking, PCI, USB, crypto, compression, I2CS, etc., there end up being about 20 files in each directory. More information on the IORPC framework is in the <hv/iorpc.h> header, included in this commit. Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
- Loading branch information
Chris Metcalf
committed
Jul 11, 2012
1 parent
bd0a521
commit 37b82b5
Showing
10 changed files
with
985 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
# Support direct access to TILE-Gx hardware from user space, via the | ||
# gxio library, or from kernel space, via kernel IORPC support. | ||
config TILE_GXIO | ||
bool | ||
depends on TILEGX |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
# | ||
# Makefile for the Tile-Gx device access support. | ||
# | ||
|
||
obj-$(CONFIG_TILE_GXIO) += iorpc_globals.o kiorpc.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
/* | ||
* 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_globals.h" | ||
|
||
struct arm_pollfd_param { | ||
union iorpc_pollfd pollfd; | ||
}; | ||
|
||
int __iorpc_arm_pollfd(int fd, int pollfd_cookie) | ||
{ | ||
struct arm_pollfd_param temp; | ||
struct arm_pollfd_param *params = &temp; | ||
|
||
params->pollfd.kernel.cookie = pollfd_cookie; | ||
|
||
return hv_dev_pwrite(fd, 0, (HV_VirtAddr) params, sizeof(*params), | ||
IORPC_OP_ARM_POLLFD); | ||
} | ||
|
||
EXPORT_SYMBOL(__iorpc_arm_pollfd); | ||
|
||
struct close_pollfd_param { | ||
union iorpc_pollfd pollfd; | ||
}; | ||
|
||
int __iorpc_close_pollfd(int fd, int pollfd_cookie) | ||
{ | ||
struct close_pollfd_param temp; | ||
struct close_pollfd_param *params = &temp; | ||
|
||
params->pollfd.kernel.cookie = pollfd_cookie; | ||
|
||
return hv_dev_pwrite(fd, 0, (HV_VirtAddr) params, sizeof(*params), | ||
IORPC_OP_CLOSE_POLLFD); | ||
} | ||
|
||
EXPORT_SYMBOL(__iorpc_close_pollfd); | ||
|
||
struct get_mmio_base_param { | ||
HV_PTE base; | ||
}; | ||
|
||
int __iorpc_get_mmio_base(int fd, HV_PTE *base) | ||
{ | ||
int __result; | ||
struct get_mmio_base_param temp; | ||
struct get_mmio_base_param *params = &temp; | ||
|
||
__result = | ||
hv_dev_pread(fd, 0, (HV_VirtAddr) params, sizeof(*params), | ||
IORPC_OP_GET_MMIO_BASE); | ||
*base = params->base; | ||
|
||
return __result; | ||
} | ||
|
||
EXPORT_SYMBOL(__iorpc_get_mmio_base); | ||
|
||
struct check_mmio_offset_param { | ||
unsigned long offset; | ||
unsigned long size; | ||
}; | ||
|
||
int __iorpc_check_mmio_offset(int fd, 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(fd, 0, (HV_VirtAddr) params, sizeof(*params), | ||
IORPC_OP_CHECK_MMIO_OFFSET); | ||
} | ||
|
||
EXPORT_SYMBOL(__iorpc_check_mmio_offset); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
/* | ||
* 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. | ||
* | ||
* TILE-Gx IORPC support for kernel I/O drivers. | ||
*/ | ||
|
||
#include <linux/mmzone.h> | ||
#include <linux/module.h> | ||
#include <linux/io.h> | ||
#include <gxio/iorpc_globals.h> | ||
#include <gxio/kiorpc.h> | ||
|
||
#ifdef DEBUG_IORPC | ||
#define TRACE(FMT, ...) pr_info(SIMPLE_MSG_LINE FMT, ## __VA_ARGS__) | ||
#else | ||
#define TRACE(...) | ||
#endif | ||
|
||
/* Create kernel-VA-space MMIO mapping for an on-chip IO device. */ | ||
void __iomem *iorpc_ioremap(int hv_fd, resource_size_t offset, | ||
unsigned long size) | ||
{ | ||
pgprot_t mmio_base, prot = { 0 }; | ||
unsigned long pfn; | ||
int err; | ||
|
||
/* Look up the shim's lotar and base PA. */ | ||
err = __iorpc_get_mmio_base(hv_fd, &mmio_base); | ||
if (err) { | ||
TRACE("get_mmio_base() failure: %d\n", err); | ||
return NULL; | ||
} | ||
|
||
/* Make sure the HV driver approves of our offset and size. */ | ||
err = __iorpc_check_mmio_offset(hv_fd, offset, size); | ||
if (err) { | ||
TRACE("check_mmio_offset() failure: %d\n", err); | ||
return NULL; | ||
} | ||
|
||
/* | ||
* mmio_base contains a base pfn and homing coordinates. Turn | ||
* it into an MMIO pgprot and offset pfn. | ||
*/ | ||
prot = hv_pte_set_lotar(prot, hv_pte_get_lotar(mmio_base)); | ||
pfn = pte_pfn(mmio_base) + PFN_DOWN(offset); | ||
|
||
return ioremap_prot(PFN_PHYS(pfn), size, prot); | ||
} | ||
|
||
EXPORT_SYMBOL(iorpc_ioremap); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
/* | ||
* 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. | ||
*/ | ||
|
||
#ifndef _GXIO_COMMON_H_ | ||
#define _GXIO_COMMON_H_ | ||
|
||
/* | ||
* Routines shared between the various GXIO device components. | ||
*/ | ||
|
||
#include <hv/iorpc.h> | ||
|
||
#include <linux/types.h> | ||
#include <linux/compiler.h> | ||
#include <linux/io.h> | ||
|
||
/* Define the standard gxio MMIO functions using kernel functions. */ | ||
#define __gxio_mmio_read8(addr) readb(addr) | ||
#define __gxio_mmio_read16(addr) readw(addr) | ||
#define __gxio_mmio_read32(addr) readl(addr) | ||
#define __gxio_mmio_read64(addr) readq(addr) | ||
#define __gxio_mmio_write8(addr, val) writeb((val), (addr)) | ||
#define __gxio_mmio_write16(addr, val) writew((val), (addr)) | ||
#define __gxio_mmio_write32(addr, val) writel((val), (addr)) | ||
#define __gxio_mmio_write64(addr, val) writeq((val), (addr)) | ||
#define __gxio_mmio_read(addr) __gxio_mmio_read64(addr) | ||
#define __gxio_mmio_write(addr, val) __gxio_mmio_write64((addr), (val)) | ||
|
||
#endif /* !_GXIO_COMMON_H_ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
/* | ||
* 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! */ | ||
#ifndef __IORPC_LINUX_RPC_H__ | ||
#define __IORPC_LINUX_RPC_H__ | ||
|
||
#include <hv/iorpc.h> | ||
|
||
#include <linux/string.h> | ||
#include <linux/module.h> | ||
#include <asm/pgtable.h> | ||
|
||
#define IORPC_OP_ARM_POLLFD IORPC_OPCODE(IORPC_FORMAT_KERNEL_POLLFD, 0x9000) | ||
#define IORPC_OP_CLOSE_POLLFD IORPC_OPCODE(IORPC_FORMAT_KERNEL_POLLFD, 0x9001) | ||
#define IORPC_OP_GET_MMIO_BASE IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x8000) | ||
#define IORPC_OP_CHECK_MMIO_OFFSET IORPC_OPCODE(IORPC_FORMAT_NONE_NOUSER, 0x8001) | ||
|
||
int __iorpc_arm_pollfd(int fd, int pollfd_cookie); | ||
|
||
int __iorpc_close_pollfd(int fd, int pollfd_cookie); | ||
|
||
int __iorpc_get_mmio_base(int fd, HV_PTE *base); | ||
|
||
int __iorpc_check_mmio_offset(int fd, unsigned long offset, unsigned long size); | ||
|
||
#endif /* !__IORPC_LINUX_RPC_H__ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
/* | ||
* 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. | ||
* | ||
* Support routines for kernel IORPC drivers. | ||
*/ | ||
|
||
#ifndef _GXIO_KIORPC_H | ||
#define _GXIO_KIORPC_H | ||
|
||
#include <linux/types.h> | ||
#include <asm/page.h> | ||
#include <arch/chip.h> | ||
|
||
#if CHIP_HAS_MMIO() | ||
void __iomem *iorpc_ioremap(int hv_fd, resource_size_t offset, | ||
unsigned long size); | ||
#endif | ||
|
||
#endif /* _GXIO_KIORPC_H */ |
Oops, something went wrong.