mirror of
https://github.com/armbian/linux.git
synced 2026-01-06 10:13:00 -08:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile
Pull arch/tile updates from Chris Metcalf: "These changes provide support for PCIe root complex and USB host mode for tilegx's on-chip I/Os. In addition, this pull provides the required underpinning for the on-chip networking support that was pulled into 3.5. The changes have all been through LKML (with several rounds for PCIe RC) and on linux-next." * git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile: tile: updates to pci root complex from community feedback bounce: allow use of bounce pool via config option usb: add host support for the tilegx architecture arch/tile: provide kernel support for the tilegx USB shim tile pci: enable IOMMU to support DMA for legacy devices arch/tile: enable ZONE_DMA for tilegx tilegx pci: support I/O to arbitrarily-cached pages tile: remove unused header arch/tile: tilegx PCI root complex support arch/tile: provide kernel support for the tilegx TRIO shim arch/tile: break out the "csum a long" function to <asm/checksum.h> arch/tile: provide kernel support for the tilegx mPIPE shim arch/tile: common DMA code for the GXIO IORPC subsystem arch/tile: support MMIO-based readb/writeb etc. arch/tile: introduce GXIO IORPC framework for tilegx
This commit is contained in:
@@ -3,6 +3,8 @@
|
||||
|
||||
config TILE
|
||||
def_bool y
|
||||
select HAVE_DMA_ATTRS
|
||||
select HAVE_DMA_API_DEBUG
|
||||
select HAVE_KVM if !TILEGX
|
||||
select GENERIC_FIND_FIRST_BIT
|
||||
select USE_GENERIC_SMP_HELPERS
|
||||
@@ -79,6 +81,9 @@ config ARCH_DMA_ADDR_T_64BIT
|
||||
config NEED_DMA_MAP_STATE
|
||||
def_bool y
|
||||
|
||||
config ARCH_HAS_DMA_SET_COHERENT_MASK
|
||||
bool
|
||||
|
||||
config LOCKDEP_SUPPORT
|
||||
def_bool y
|
||||
|
||||
@@ -212,6 +217,22 @@ config HIGHMEM
|
||||
|
||||
If unsure, say "true".
|
||||
|
||||
config ZONE_DMA
|
||||
def_bool y
|
||||
|
||||
config IOMMU_HELPER
|
||||
bool
|
||||
|
||||
config NEED_SG_DMA_LENGTH
|
||||
bool
|
||||
|
||||
config SWIOTLB
|
||||
bool
|
||||
default TILEGX
|
||||
select IOMMU_HELPER
|
||||
select NEED_SG_DMA_LENGTH
|
||||
select ARCH_HAS_DMA_SET_COHERENT_MASK
|
||||
|
||||
# We do not currently support disabling NUMA.
|
||||
config NUMA
|
||||
bool # "NUMA Memory Allocation and Scheduler Support"
|
||||
@@ -345,6 +366,8 @@ config KERNEL_PL
|
||||
kernel will be built to run at. Generally you should use
|
||||
the default value here.
|
||||
|
||||
source "arch/tile/gxio/Kconfig"
|
||||
|
||||
endmenu # Tilera-specific configuration
|
||||
|
||||
menu "Bus options"
|
||||
@@ -354,6 +377,9 @@ config PCI
|
||||
default y
|
||||
select PCI_DOMAINS
|
||||
select GENERIC_PCI_IOMAP
|
||||
select TILE_GXIO_TRIO if TILEGX
|
||||
select ARCH_SUPPORTS_MSI if TILEGX
|
||||
select PCI_MSI if TILEGX
|
||||
---help---
|
||||
Enable PCI root complex support, so PCIe endpoint devices can
|
||||
be attached to the Tile chip. Many, but not all, PCI devices
|
||||
@@ -370,6 +396,22 @@ config NO_IOPORT
|
||||
|
||||
source "drivers/pci/Kconfig"
|
||||
|
||||
config TILE_USB
|
||||
tristate "Tilera USB host adapter support"
|
||||
default y
|
||||
depends on USB
|
||||
depends on TILEGX
|
||||
select TILE_GXIO_USB_HOST
|
||||
---help---
|
||||
Provides USB host adapter support for the built-in EHCI and OHCI
|
||||
interfaces on TILE-Gx chips.
|
||||
|
||||
# USB OHCI needs the bounce pool since tilegx will often have more
|
||||
# than 4GB of memory, but we don't currently use the IOTLB to present
|
||||
# a 32-bit address to OHCI. So we need to use a bounce pool instead.
|
||||
config NEED_BOUNCE_POOL
|
||||
def_bool USB_OHCI_HCD
|
||||
|
||||
config HOTPLUG
|
||||
bool "Support for hot-pluggable devices"
|
||||
---help---
|
||||
|
||||
@@ -59,6 +59,8 @@ libs-y += $(LIBGCC_PATH)
|
||||
# See arch/tile/Kbuild for content of core part of the kernel
|
||||
core-y += arch/tile/
|
||||
|
||||
core-$(CONFIG_TILE_GXIO) += arch/tile/gxio/
|
||||
|
||||
ifdef TILERA_ROOT
|
||||
INSTALL_PATH ?= $(TILERA_ROOT)/tile/boot
|
||||
endif
|
||||
|
||||
28
arch/tile/gxio/Kconfig
Normal file
28
arch/tile/gxio/Kconfig
Normal file
@@ -0,0 +1,28 @@
|
||||
# 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
|
||||
|
||||
# Support direct access to the common I/O DMA facility within the
|
||||
# TILE-Gx mPIPE and Trio hardware from kernel space.
|
||||
config TILE_GXIO_DMA
|
||||
bool
|
||||
select TILE_GXIO
|
||||
|
||||
# Support direct access to the TILE-Gx mPIPE hardware from kernel space.
|
||||
config TILE_GXIO_MPIPE
|
||||
bool
|
||||
select TILE_GXIO
|
||||
select TILE_GXIO_DMA
|
||||
|
||||
# Support direct access to the TILE-Gx TRIO hardware from kernel space.
|
||||
config TILE_GXIO_TRIO
|
||||
bool
|
||||
select TILE_GXIO
|
||||
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
|
||||
9
arch/tile/gxio/Makefile
Normal file
9
arch/tile/gxio/Makefile
Normal file
@@ -0,0 +1,9 @@
|
||||
#
|
||||
# Makefile for the Tile-Gx device access support.
|
||||
#
|
||||
|
||||
obj-$(CONFIG_TILE_GXIO) += iorpc_globals.o kiorpc.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_TRIO) += trio.o iorpc_trio.o
|
||||
obj-$(CONFIG_TILE_GXIO_USB_HOST) += usb_host.o iorpc_usb_host.o
|
||||
176
arch/tile/gxio/dma_queue.c
Normal file
176
arch/tile/gxio/dma_queue.c
Normal file
@@ -0,0 +1,176 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/module.h>
|
||||
#include <gxio/dma_queue.h>
|
||||
|
||||
/* Wait for a memory read to complete. */
|
||||
#define wait_for_value(val) \
|
||||
__asm__ __volatile__("move %0, %0" :: "r"(val))
|
||||
|
||||
/* The index is in the low 16. */
|
||||
#define DMA_QUEUE_INDEX_MASK ((1 << 16) - 1)
|
||||
|
||||
/*
|
||||
* The hardware descriptor-ring type.
|
||||
* This matches the types used by mpipe (MPIPE_EDMA_POST_REGION_VAL_t)
|
||||
* and trio (TRIO_PUSH_DMA_REGION_VAL_t or TRIO_PULL_DMA_REGION_VAL_t).
|
||||
* See those types for more documentation on the individual fields.
|
||||
*/
|
||||
typedef union {
|
||||
struct {
|
||||
#ifndef __BIG_ENDIAN__
|
||||
uint64_t ring_idx:16;
|
||||
uint64_t count:16;
|
||||
uint64_t gen:1;
|
||||
uint64_t __reserved:31;
|
||||
#else
|
||||
uint64_t __reserved:31;
|
||||
uint64_t gen:1;
|
||||
uint64_t count:16;
|
||||
uint64_t ring_idx:16;
|
||||
#endif
|
||||
};
|
||||
uint64_t word;
|
||||
} __gxio_ring_t;
|
||||
|
||||
void __gxio_dma_queue_init(__gxio_dma_queue_t *dma_queue,
|
||||
void *post_region_addr, unsigned int num_entries)
|
||||
{
|
||||
/*
|
||||
* Limit 65536 entry rings to 65535 credits because we only have a
|
||||
* 16 bit completion counter.
|
||||
*/
|
||||
int64_t credits = (num_entries < 65536) ? num_entries : 65535;
|
||||
|
||||
memset(dma_queue, 0, sizeof(*dma_queue));
|
||||
|
||||
dma_queue->post_region_addr = post_region_addr;
|
||||
dma_queue->hw_complete_count = 0;
|
||||
dma_queue->credits_and_next_index = credits << DMA_QUEUE_CREDIT_SHIFT;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(__gxio_dma_queue_init);
|
||||
|
||||
void __gxio_dma_queue_update_credits(__gxio_dma_queue_t *dma_queue)
|
||||
{
|
||||
__gxio_ring_t val;
|
||||
uint64_t count;
|
||||
uint64_t delta;
|
||||
uint64_t new_count;
|
||||
|
||||
/*
|
||||
* Read the 64-bit completion count without touching the cache, so
|
||||
* we later avoid having to evict any sharers of this cache line
|
||||
* when we update it below.
|
||||
*/
|
||||
uint64_t orig_hw_complete_count =
|
||||
cmpxchg(&dma_queue->hw_complete_count,
|
||||
-1, -1);
|
||||
|
||||
/* Make sure the load completes before we access the hardware. */
|
||||
wait_for_value(orig_hw_complete_count);
|
||||
|
||||
/* Read the 16-bit count of how many packets it has completed. */
|
||||
val.word = __gxio_mmio_read(dma_queue->post_region_addr);
|
||||
count = val.count;
|
||||
|
||||
/*
|
||||
* Calculate the number of completions since we last updated the
|
||||
* 64-bit counter. It's safe to ignore the high bits because the
|
||||
* maximum credit value is 65535.
|
||||
*/
|
||||
delta = (count - orig_hw_complete_count) & 0xffff;
|
||||
if (delta == 0)
|
||||
return;
|
||||
|
||||
/*
|
||||
* Try to write back the count, advanced by delta. If we race with
|
||||
* another thread, this might fail, in which case we return
|
||||
* immediately on the assumption that some credits are (or at least
|
||||
* were) available.
|
||||
*/
|
||||
new_count = orig_hw_complete_count + delta;
|
||||
if (cmpxchg(&dma_queue->hw_complete_count,
|
||||
orig_hw_complete_count,
|
||||
new_count) != orig_hw_complete_count)
|
||||
return;
|
||||
|
||||
/*
|
||||
* We succeeded in advancing the completion count; add back the
|
||||
* corresponding number of egress credits.
|
||||
*/
|
||||
__insn_fetchadd(&dma_queue->credits_and_next_index,
|
||||
(delta << DMA_QUEUE_CREDIT_SHIFT));
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(__gxio_dma_queue_update_credits);
|
||||
|
||||
/*
|
||||
* A separate 'blocked' method for put() so that backtraces and
|
||||
* profiles will clearly indicate that we're wasting time spinning on
|
||||
* egress availability rather than actually posting commands.
|
||||
*/
|
||||
int64_t __gxio_dma_queue_wait_for_credits(__gxio_dma_queue_t *dma_queue,
|
||||
int64_t modifier)
|
||||
{
|
||||
int backoff = 16;
|
||||
int64_t old;
|
||||
|
||||
do {
|
||||
int i;
|
||||
/* Back off to avoid spamming memory networks. */
|
||||
for (i = backoff; i > 0; i--)
|
||||
__insn_mfspr(SPR_PASS);
|
||||
|
||||
/* Check credits again. */
|
||||
__gxio_dma_queue_update_credits(dma_queue);
|
||||
old = __insn_fetchaddgez(&dma_queue->credits_and_next_index,
|
||||
modifier);
|
||||
|
||||
/* Calculate bounded exponential backoff for next iteration. */
|
||||
if (backoff < 256)
|
||||
backoff *= 2;
|
||||
} while (old + modifier < 0);
|
||||
|
||||
return old;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(__gxio_dma_queue_wait_for_credits);
|
||||
|
||||
int64_t __gxio_dma_queue_reserve_aux(__gxio_dma_queue_t *dma_queue,
|
||||
unsigned int num, int wait)
|
||||
{
|
||||
return __gxio_dma_queue_reserve(dma_queue, num, wait != 0, true);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(__gxio_dma_queue_reserve_aux);
|
||||
|
||||
int __gxio_dma_queue_is_complete(__gxio_dma_queue_t *dma_queue,
|
||||
int64_t completion_slot, int update)
|
||||
{
|
||||
if (update) {
|
||||
if (ACCESS_ONCE(dma_queue->hw_complete_count) >
|
||||
completion_slot)
|
||||
return 1;
|
||||
|
||||
__gxio_dma_queue_update_credits(dma_queue);
|
||||
}
|
||||
|
||||
return ACCESS_ONCE(dma_queue->hw_complete_count) > completion_slot;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(__gxio_dma_queue_is_complete);
|
||||
89
arch/tile/gxio/iorpc_globals.c
Normal file
89
arch/tile/gxio/iorpc_globals.c
Normal file
@@ -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);
|
||||
529
arch/tile/gxio/iorpc_mpipe.c
Normal file
529
arch/tile/gxio/iorpc_mpipe.c
Normal file
File diff suppressed because it is too large
Load Diff
85
arch/tile/gxio/iorpc_mpipe_info.c
Normal file
85
arch/tile/gxio/iorpc_mpipe_info.c
Normal file
@@ -0,0 +1,85 @@
|
||||
/*
|
||||
* 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_mpipe_info.h"
|
||||
|
||||
|
||||
struct enumerate_aux_param {
|
||||
_gxio_mpipe_link_name_t name;
|
||||
_gxio_mpipe_link_mac_t mac;
|
||||
};
|
||||
|
||||
int gxio_mpipe_info_enumerate_aux(gxio_mpipe_info_context_t * context,
|
||||
unsigned int idx,
|
||||
_gxio_mpipe_link_name_t * name,
|
||||
_gxio_mpipe_link_mac_t * mac)
|
||||
{
|
||||
int __result;
|
||||
struct enumerate_aux_param temp;
|
||||
struct enumerate_aux_param *params = &temp;
|
||||
|
||||
__result =
|
||||
hv_dev_pread(context->fd, 0, (HV_VirtAddr) params, sizeof(*params),
|
||||
(((uint64_t) idx << 32) |
|
||||
GXIO_MPIPE_INFO_OP_ENUMERATE_AUX));
|
||||
*name = params->name;
|
||||
*mac = params->mac;
|
||||
|
||||
return __result;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(gxio_mpipe_info_enumerate_aux);
|
||||
|
||||
struct get_mmio_base_param {
|
||||
HV_PTE base;
|
||||
};
|
||||
|
||||
int gxio_mpipe_info_get_mmio_base(gxio_mpipe_info_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_MPIPE_INFO_OP_GET_MMIO_BASE);
|
||||
*base = params->base;
|
||||
|
||||
return __result;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(gxio_mpipe_info_get_mmio_base);
|
||||
|
||||
struct check_mmio_offset_param {
|
||||
unsigned long offset;
|
||||
unsigned long size;
|
||||
};
|
||||
|
||||
int gxio_mpipe_info_check_mmio_offset(gxio_mpipe_info_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_MPIPE_INFO_OP_CHECK_MMIO_OFFSET);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(gxio_mpipe_info_check_mmio_offset);
|
||||
327
arch/tile/gxio/iorpc_trio.c
Normal file
327
arch/tile/gxio/iorpc_trio.c
Normal file
@@ -0,0 +1,327 @@
|
||||
/*
|
||||
* 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_trio.h"
|
||||
|
||||
struct alloc_asids_param {
|
||||
unsigned int count;
|
||||
unsigned int first;
|
||||
unsigned int flags;
|
||||
};
|
||||
|
||||
int gxio_trio_alloc_asids(gxio_trio_context_t * context, unsigned int count,
|
||||
unsigned int first, unsigned int flags)
|
||||
{
|
||||
struct alloc_asids_param temp;
|
||||
struct alloc_asids_param *params = &temp;
|
||||
|
||||
params->count = count;
|
||||
params->first = first;
|
||||
params->flags = flags;
|
||||
|
||||
return hv_dev_pwrite(context->fd, 0, (HV_VirtAddr) params,
|
||||
sizeof(*params), GXIO_TRIO_OP_ALLOC_ASIDS);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(gxio_trio_alloc_asids);
|
||||
|
||||
|
||||
struct alloc_memory_maps_param {
|
||||
unsigned int count;
|
||||
unsigned int first;
|
||||
unsigned int flags;
|
||||
};
|
||||
|
||||
int gxio_trio_alloc_memory_maps(gxio_trio_context_t * context,
|
||||
unsigned int count, unsigned int first,
|
||||
unsigned int flags)
|
||||
{
|
||||
struct alloc_memory_maps_param temp;
|
||||
struct alloc_memory_maps_param *params = &temp;
|
||||
|
||||
params->count = count;
|
||||
params->first = first;
|
||||
params->flags = flags;
|
||||
|
||||
return hv_dev_pwrite(context->fd, 0, (HV_VirtAddr) params,
|
||||
sizeof(*params), GXIO_TRIO_OP_ALLOC_MEMORY_MAPS);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(gxio_trio_alloc_memory_maps);
|
||||
|
||||
|
||||
struct alloc_pio_regions_param {
|
||||
unsigned int count;
|
||||
unsigned int first;
|
||||
unsigned int flags;
|
||||
};
|
||||
|
||||
int gxio_trio_alloc_pio_regions(gxio_trio_context_t * context,
|
||||
unsigned int count, unsigned int first,
|
||||
unsigned int flags)
|
||||
{
|
||||
struct alloc_pio_regions_param temp;
|
||||
struct alloc_pio_regions_param *params = &temp;
|
||||
|
||||
params->count = count;
|
||||
params->first = first;
|
||||
params->flags = flags;
|
||||
|
||||
return hv_dev_pwrite(context->fd, 0, (HV_VirtAddr) params,
|
||||
sizeof(*params), GXIO_TRIO_OP_ALLOC_PIO_REGIONS);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(gxio_trio_alloc_pio_regions);
|
||||
|
||||
struct init_pio_region_aux_param {
|
||||
unsigned int pio_region;
|
||||
unsigned int mac;
|
||||
uint32_t bus_address_hi;
|
||||
unsigned int flags;
|
||||
};
|
||||
|
||||
int gxio_trio_init_pio_region_aux(gxio_trio_context_t * context,
|
||||
unsigned int pio_region, unsigned int mac,
|
||||
uint32_t bus_address_hi, unsigned int flags)
|
||||
{
|
||||
struct init_pio_region_aux_param temp;
|
||||
struct init_pio_region_aux_param *params = &temp;
|
||||
|
||||
params->pio_region = pio_region;
|
||||
params->mac = mac;
|
||||
params->bus_address_hi = bus_address_hi;
|
||||
params->flags = flags;
|
||||
|
||||
return hv_dev_pwrite(context->fd, 0, (HV_VirtAddr) params,
|
||||
sizeof(*params), GXIO_TRIO_OP_INIT_PIO_REGION_AUX);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(gxio_trio_init_pio_region_aux);
|
||||
|
||||
|
||||
struct init_memory_map_mmu_aux_param {
|
||||
unsigned int map;
|
||||
unsigned long va;
|
||||
uint64_t size;
|
||||
unsigned int asid;
|
||||
unsigned int mac;
|
||||
uint64_t bus_address;
|
||||
unsigned int node;
|
||||
unsigned int order_mode;
|
||||
};
|
||||
|
||||
int gxio_trio_init_memory_map_mmu_aux(gxio_trio_context_t * context,
|
||||
unsigned int map, unsigned long va,
|
||||
uint64_t size, unsigned int asid,
|
||||
unsigned int mac, uint64_t bus_address,
|
||||
unsigned int node,
|
||||
unsigned int order_mode)
|
||||
{
|
||||
struct init_memory_map_mmu_aux_param temp;
|
||||
struct init_memory_map_mmu_aux_param *params = &temp;
|
||||
|
||||
params->map = map;
|
||||
params->va = va;
|
||||
params->size = size;
|
||||
params->asid = asid;
|
||||
params->mac = mac;
|
||||
params->bus_address = bus_address;
|
||||
params->node = node;
|
||||
params->order_mode = order_mode;
|
||||
|
||||
return hv_dev_pwrite(context->fd, 0, (HV_VirtAddr) params,
|
||||
sizeof(*params),
|
||||
GXIO_TRIO_OP_INIT_MEMORY_MAP_MMU_AUX);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(gxio_trio_init_memory_map_mmu_aux);
|
||||
|
||||
struct get_port_property_param {
|
||||
struct pcie_trio_ports_property trio_ports;
|
||||
};
|
||||
|
||||
int gxio_trio_get_port_property(gxio_trio_context_t * context,
|
||||
struct pcie_trio_ports_property *trio_ports)
|
||||
{
|
||||
int __result;
|
||||
struct get_port_property_param temp;
|
||||
struct get_port_property_param *params = &temp;
|
||||
|
||||
__result =
|
||||
hv_dev_pread(context->fd, 0, (HV_VirtAddr) params, sizeof(*params),
|
||||
GXIO_TRIO_OP_GET_PORT_PROPERTY);
|
||||
*trio_ports = params->trio_ports;
|
||||
|
||||
return __result;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(gxio_trio_get_port_property);
|
||||
|
||||
struct config_legacy_intr_param {
|
||||
union iorpc_interrupt interrupt;
|
||||
unsigned int mac;
|
||||
unsigned int intx;
|
||||
};
|
||||
|
||||
int gxio_trio_config_legacy_intr(gxio_trio_context_t * context, int inter_x,
|
||||
int inter_y, int inter_ipi, int inter_event,
|
||||
unsigned int mac, unsigned int intx)
|
||||
{
|
||||
struct config_legacy_intr_param temp;
|
||||
struct config_legacy_intr_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;
|
||||
params->mac = mac;
|
||||
params->intx = intx;
|
||||
|
||||
return hv_dev_pwrite(context->fd, 0, (HV_VirtAddr) params,
|
||||
sizeof(*params), GXIO_TRIO_OP_CONFIG_LEGACY_INTR);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(gxio_trio_config_legacy_intr);
|
||||
|
||||
struct config_msi_intr_param {
|
||||
union iorpc_interrupt interrupt;
|
||||
unsigned int mac;
|
||||
unsigned int mem_map;
|
||||
uint64_t mem_map_base;
|
||||
uint64_t mem_map_limit;
|
||||
unsigned int asid;
|
||||
};
|
||||
|
||||
int gxio_trio_config_msi_intr(gxio_trio_context_t * context, int inter_x,
|
||||
int inter_y, int inter_ipi, int inter_event,
|
||||
unsigned int mac, unsigned int mem_map,
|
||||
uint64_t mem_map_base, uint64_t mem_map_limit,
|
||||
unsigned int asid)
|
||||
{
|
||||
struct config_msi_intr_param temp;
|
||||
struct config_msi_intr_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;
|
||||
params->mac = mac;
|
||||
params->mem_map = mem_map;
|
||||
params->mem_map_base = mem_map_base;
|
||||
params->mem_map_limit = mem_map_limit;
|
||||
params->asid = asid;
|
||||
|
||||
return hv_dev_pwrite(context->fd, 0, (HV_VirtAddr) params,
|
||||
sizeof(*params), GXIO_TRIO_OP_CONFIG_MSI_INTR);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(gxio_trio_config_msi_intr);
|
||||
|
||||
|
||||
struct set_mps_mrs_param {
|
||||
uint16_t mps;
|
||||
uint16_t mrs;
|
||||
unsigned int mac;
|
||||
};
|
||||
|
||||
int gxio_trio_set_mps_mrs(gxio_trio_context_t * context, uint16_t mps,
|
||||
uint16_t mrs, unsigned int mac)
|
||||
{
|
||||
struct set_mps_mrs_param temp;
|
||||
struct set_mps_mrs_param *params = &temp;
|
||||
|
||||
params->mps = mps;
|
||||
params->mrs = mrs;
|
||||
params->mac = mac;
|
||||
|
||||
return hv_dev_pwrite(context->fd, 0, (HV_VirtAddr) params,
|
||||
sizeof(*params), GXIO_TRIO_OP_SET_MPS_MRS);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(gxio_trio_set_mps_mrs);
|
||||
|
||||
struct force_rc_link_up_param {
|
||||
unsigned int mac;
|
||||
};
|
||||
|
||||
int gxio_trio_force_rc_link_up(gxio_trio_context_t * context, unsigned int mac)
|
||||
{
|
||||
struct force_rc_link_up_param temp;
|
||||
struct force_rc_link_up_param *params = &temp;
|
||||
|
||||
params->mac = mac;
|
||||
|
||||
return hv_dev_pwrite(context->fd, 0, (HV_VirtAddr) params,
|
||||
sizeof(*params), GXIO_TRIO_OP_FORCE_RC_LINK_UP);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(gxio_trio_force_rc_link_up);
|
||||
|
||||
struct force_ep_link_up_param {
|
||||
unsigned int mac;
|
||||
};
|
||||
|
||||
int gxio_trio_force_ep_link_up(gxio_trio_context_t * context, unsigned int mac)
|
||||
{
|
||||
struct force_ep_link_up_param temp;
|
||||
struct force_ep_link_up_param *params = &temp;
|
||||
|
||||
params->mac = mac;
|
||||
|
||||
return hv_dev_pwrite(context->fd, 0, (HV_VirtAddr) params,
|
||||
sizeof(*params), GXIO_TRIO_OP_FORCE_EP_LINK_UP);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(gxio_trio_force_ep_link_up);
|
||||
|
||||
struct get_mmio_base_param {
|
||||
HV_PTE base;
|
||||
};
|
||||
|
||||
int gxio_trio_get_mmio_base(gxio_trio_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_TRIO_OP_GET_MMIO_BASE);
|
||||
*base = params->base;
|
||||
|
||||
return __result;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(gxio_trio_get_mmio_base);
|
||||
|
||||
struct check_mmio_offset_param {
|
||||
unsigned long offset;
|
||||
unsigned long size;
|
||||
};
|
||||
|
||||
int gxio_trio_check_mmio_offset(gxio_trio_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_TRIO_OP_CHECK_MMIO_OFFSET);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(gxio_trio_check_mmio_offset);
|
||||
99
arch/tile/gxio/iorpc_usb_host.c
Normal file
99
arch/tile/gxio/iorpc_usb_host.c
Normal file
@@ -0,0 +1,99 @@
|
||||
/*
|
||||
* 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);
|
||||
61
arch/tile/gxio/kiorpc.c
Normal file
61
arch/tile/gxio/kiorpc.c
Normal file
@@ -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);
|
||||
545
arch/tile/gxio/mpipe.c
Normal file
545
arch/tile/gxio/mpipe.c
Normal file
File diff suppressed because it is too large
Load Diff
49
arch/tile/gxio/trio.c
Normal file
49
arch/tile/gxio/trio.c
Normal file
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
* 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 trio gxio calls.
|
||||
*/
|
||||
|
||||
#include <linux/errno.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/module.h>
|
||||
|
||||
#include <gxio/trio.h>
|
||||
#include <gxio/iorpc_globals.h>
|
||||
#include <gxio/iorpc_trio.h>
|
||||
#include <gxio/kiorpc.h>
|
||||
|
||||
int gxio_trio_init(gxio_trio_context_t *context, unsigned int trio_index)
|
||||
{
|
||||
char file[32];
|
||||
int fd;
|
||||
|
||||
snprintf(file, sizeof(file), "trio/%d/iorpc", trio_index);
|
||||
fd = hv_dev_open((HV_VirtAddr) file, 0);
|
||||
if (fd < 0) {
|
||||
context->fd = -1;
|
||||
|
||||
if (fd >= GXIO_ERR_MIN && fd <= GXIO_ERR_MAX)
|
||||
return fd;
|
||||
else
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
context->fd = fd;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL_GPL(gxio_trio_init);
|
||||
91
arch/tile/gxio/usb_host.c
Normal file
91
arch/tile/gxio/usb_host.c
Normal file
@@ -0,0 +1,91 @@
|
||||
/*
|
||||
* 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);
|
||||
359
arch/tile/include/arch/mpipe.h
Normal file
359
arch/tile/include/arch/mpipe.h
Normal file
@@ -0,0 +1,359 @@
|
||||
/*
|
||||
* 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_MPIPE_H__
|
||||
#define __ARCH_MPIPE_H__
|
||||
|
||||
#include <arch/abi.h>
|
||||
#include <arch/mpipe_def.h>
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
/*
|
||||
* MMIO Ingress DMA Release Region Address.
|
||||
* This is a description of the physical addresses used to manipulate ingress
|
||||
* credit counters. Accesses to this address space should use an address of
|
||||
* this form and a value like that specified in IDMA_RELEASE_REGION_VAL.
|
||||
*/
|
||||
|
||||
__extension__
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
#ifndef __BIG_ENDIAN__
|
||||
/* Reserved. */
|
||||
uint_reg_t __reserved_0 : 3;
|
||||
/* NotifRing to be released */
|
||||
uint_reg_t ring : 8;
|
||||
/* Bucket to be released */
|
||||
uint_reg_t bucket : 13;
|
||||
/* Enable NotifRing release */
|
||||
uint_reg_t ring_enable : 1;
|
||||
/* Enable Bucket release */
|
||||
uint_reg_t bucket_enable : 1;
|
||||
/*
|
||||
* This field of the address selects the region (address space) to be
|
||||
* accessed. For the iDMA release region, this field must be 4.
|
||||
*/
|
||||
uint_reg_t region : 3;
|
||||
/* Reserved. */
|
||||
uint_reg_t __reserved_1 : 6;
|
||||
/* This field of the address indexes the 32 entry service domain table. */
|
||||
uint_reg_t svc_dom : 5;
|
||||
/* Reserved. */
|
||||
uint_reg_t __reserved_2 : 24;
|
||||
#else /* __BIG_ENDIAN__ */
|
||||
uint_reg_t __reserved_2 : 24;
|
||||
uint_reg_t svc_dom : 5;
|
||||
uint_reg_t __reserved_1 : 6;
|
||||
uint_reg_t region : 3;
|
||||
uint_reg_t bucket_enable : 1;
|
||||
uint_reg_t ring_enable : 1;
|
||||
uint_reg_t bucket : 13;
|
||||
uint_reg_t ring : 8;
|
||||
uint_reg_t __reserved_0 : 3;
|
||||
#endif
|
||||
};
|
||||
|
||||
uint_reg_t word;
|
||||
} MPIPE_IDMA_RELEASE_REGION_ADDR_t;
|
||||
|
||||
/*
|
||||
* MMIO Ingress DMA Release Region Value - Release NotifRing and/or Bucket.
|
||||
* Provides release of the associated NotifRing. The address of the MMIO
|
||||
* operation is described in IDMA_RELEASE_REGION_ADDR.
|
||||
*/
|
||||
|
||||
__extension__
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
#ifndef __BIG_ENDIAN__
|
||||
/*
|
||||
* Number of packets being released. The load balancer's count of
|
||||
* inflight packets will be decremented by this amount for the associated
|
||||
* Bucket and/or NotifRing
|
||||
*/
|
||||
uint_reg_t count : 16;
|
||||
/* Reserved. */
|
||||
uint_reg_t __reserved : 48;
|
||||
#else /* __BIG_ENDIAN__ */
|
||||
uint_reg_t __reserved : 48;
|
||||
uint_reg_t count : 16;
|
||||
#endif
|
||||
};
|
||||
|
||||
uint_reg_t word;
|
||||
} MPIPE_IDMA_RELEASE_REGION_VAL_t;
|
||||
|
||||
/*
|
||||
* MMIO Buffer Stack Manager Region Address.
|
||||
* This MMIO region is used for posting or fetching buffers to/from the
|
||||
* buffer stack manager. On an MMIO load, this pops a buffer descriptor from
|
||||
* the top of stack if one is available. On an MMIO store, this pushes a
|
||||
* buffer to the stack. The value read or written is described in
|
||||
* BSM_REGION_VAL.
|
||||
*/
|
||||
|
||||
__extension__
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
#ifndef __BIG_ENDIAN__
|
||||
/* Reserved. */
|
||||
uint_reg_t __reserved_0 : 3;
|
||||
/* BufferStack being accessed. */
|
||||
uint_reg_t stack : 5;
|
||||
/* Reserved. */
|
||||
uint_reg_t __reserved_1 : 18;
|
||||
/*
|
||||
* This field of the address selects the region (address space) to be
|
||||
* accessed. For the buffer stack manager region, this field must be 6.
|
||||
*/
|
||||
uint_reg_t region : 3;
|
||||
/* Reserved. */
|
||||
uint_reg_t __reserved_2 : 6;
|
||||
/* This field of the address indexes the 32 entry service domain table. */
|
||||
uint_reg_t svc_dom : 5;
|
||||
/* Reserved. */
|
||||
uint_reg_t __reserved_3 : 24;
|
||||
#else /* __BIG_ENDIAN__ */
|
||||
uint_reg_t __reserved_3 : 24;
|
||||
uint_reg_t svc_dom : 5;
|
||||
uint_reg_t __reserved_2 : 6;
|
||||
uint_reg_t region : 3;
|
||||
uint_reg_t __reserved_1 : 18;
|
||||
uint_reg_t stack : 5;
|
||||
uint_reg_t __reserved_0 : 3;
|
||||
#endif
|
||||
};
|
||||
|
||||
uint_reg_t word;
|
||||
} MPIPE_BSM_REGION_ADDR_t;
|
||||
|
||||
/*
|
||||
* MMIO Buffer Stack Manager Region Value.
|
||||
* This MMIO region is used for posting or fetching buffers to/from the
|
||||
* buffer stack manager. On an MMIO load, this pops a buffer descriptor from
|
||||
* the top of stack if one is available. On an MMIO store, this pushes a
|
||||
* buffer to the stack. The address of the MMIO operation is described in
|
||||
* BSM_REGION_ADDR.
|
||||
*/
|
||||
|
||||
__extension__
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
#ifndef __BIG_ENDIAN__
|
||||
/* Reserved. */
|
||||
uint_reg_t __reserved_0 : 7;
|
||||
/*
|
||||
* Base virtual address of the buffer. Must be sign extended by consumer.
|
||||
*/
|
||||
int_reg_t va : 35;
|
||||
/* Reserved. */
|
||||
uint_reg_t __reserved_1 : 6;
|
||||
/*
|
||||
* Index of the buffer stack to which this buffer belongs. Ignored on
|
||||
* writes since the offset bits specify the stack being accessed.
|
||||
*/
|
||||
uint_reg_t stack_idx : 5;
|
||||
/* Reserved. */
|
||||
uint_reg_t __reserved_2 : 5;
|
||||
/*
|
||||
* Reads as one to indicate that this is a hardware managed buffer.
|
||||
* Ignored on writes since all buffers on a given stack are the same size.
|
||||
*/
|
||||
uint_reg_t hwb : 1;
|
||||
/*
|
||||
* Encoded size of buffer (ignored on writes):
|
||||
* 0 = 128 bytes
|
||||
* 1 = 256 bytes
|
||||
* 2 = 512 bytes
|
||||
* 3 = 1024 bytes
|
||||
* 4 = 1664 bytes
|
||||
* 5 = 4096 bytes
|
||||
* 6 = 10368 bytes
|
||||
* 7 = 16384 bytes
|
||||
*/
|
||||
uint_reg_t size : 3;
|
||||
/*
|
||||
* Valid indication for the buffer. Ignored on writes.
|
||||
* 0 : Valid buffer descriptor popped from stack.
|
||||
* 3 : Could not pop a buffer from the stack. Either the stack is empty,
|
||||
* or the hardware's prefetch buffer is empty for this stack.
|
||||
*/
|
||||
uint_reg_t c : 2;
|
||||
#else /* __BIG_ENDIAN__ */
|
||||
uint_reg_t c : 2;
|
||||
uint_reg_t size : 3;
|
||||
uint_reg_t hwb : 1;
|
||||
uint_reg_t __reserved_2 : 5;
|
||||
uint_reg_t stack_idx : 5;
|
||||
uint_reg_t __reserved_1 : 6;
|
||||
int_reg_t va : 35;
|
||||
uint_reg_t __reserved_0 : 7;
|
||||
#endif
|
||||
};
|
||||
|
||||
uint_reg_t word;
|
||||
} MPIPE_BSM_REGION_VAL_t;
|
||||
|
||||
/*
|
||||
* MMIO Egress DMA Post Region Address.
|
||||
* Used to post descriptor locations to the eDMA descriptor engine. The
|
||||
* value to be written is described in EDMA_POST_REGION_VAL
|
||||
*/
|
||||
|
||||
__extension__
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
#ifndef __BIG_ENDIAN__
|
||||
/* Reserved. */
|
||||
uint_reg_t __reserved_0 : 3;
|
||||
/* eDMA ring being accessed */
|
||||
uint_reg_t ring : 5;
|
||||
/* Reserved. */
|
||||
uint_reg_t __reserved_1 : 18;
|
||||
/*
|
||||
* This field of the address selects the region (address space) to be
|
||||
* accessed. For the egress DMA post region, this field must be 5.
|
||||
*/
|
||||
uint_reg_t region : 3;
|
||||
/* Reserved. */
|
||||
uint_reg_t __reserved_2 : 6;
|
||||
/* This field of the address indexes the 32 entry service domain table. */
|
||||
uint_reg_t svc_dom : 5;
|
||||
/* Reserved. */
|
||||
uint_reg_t __reserved_3 : 24;
|
||||
#else /* __BIG_ENDIAN__ */
|
||||
uint_reg_t __reserved_3 : 24;
|
||||
uint_reg_t svc_dom : 5;
|
||||
uint_reg_t __reserved_2 : 6;
|
||||
uint_reg_t region : 3;
|
||||
uint_reg_t __reserved_1 : 18;
|
||||
uint_reg_t ring : 5;
|
||||
uint_reg_t __reserved_0 : 3;
|
||||
#endif
|
||||
};
|
||||
|
||||
uint_reg_t word;
|
||||
} MPIPE_EDMA_POST_REGION_ADDR_t;
|
||||
|
||||
/*
|
||||
* MMIO Egress DMA Post Region Value.
|
||||
* Used to post descriptor locations to the eDMA descriptor engine. The
|
||||
* address is described in EDMA_POST_REGION_ADDR.
|
||||
*/
|
||||
|
||||
__extension__
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
#ifndef __BIG_ENDIAN__
|
||||
/*
|
||||
* For writes, this specifies the current ring tail pointer prior to any
|
||||
* post. For example, to post 1 or more descriptors starting at location
|
||||
* 23, this would contain 23 (not 24). On writes, this index must be
|
||||
* masked based on the ring size. The new tail pointer after this post
|
||||
* is COUNT+RING_IDX (masked by the ring size).
|
||||
*
|
||||
* For reads, this provides the hardware descriptor fetcher's head
|
||||
* pointer. The descriptors prior to the head pointer, however, may not
|
||||
* yet have been processed so this indicator is only used to determine
|
||||
* how full the ring is and if software may post more descriptors.
|
||||
*/
|
||||
uint_reg_t ring_idx : 16;
|
||||
/*
|
||||
* For writes, this specifies number of contiguous descriptors that are
|
||||
* being posted. Software may post up to RingSize descriptors with a
|
||||
* single MMIO store. A zero in this field on a write will "wake up" an
|
||||
* eDMA ring and cause it fetch descriptors regardless of the hardware's
|
||||
* current view of the state of the tail pointer.
|
||||
*
|
||||
* For reads, this field provides a rolling count of the number of
|
||||
* descriptors that have been completely processed. This may be used by
|
||||
* software to determine when buffers associated with a descriptor may be
|
||||
* returned or reused. When the ring's flush bit is cleared by software
|
||||
* (after having been set by HW or SW), the COUNT will be cleared.
|
||||
*/
|
||||
uint_reg_t count : 16;
|
||||
/*
|
||||
* For writes, this specifies the generation number of the tail being
|
||||
* posted. Note that if tail+cnt wraps to the beginning of the ring, the
|
||||
* eDMA hardware assumes that the descriptors posted at the beginning of
|
||||
* the ring are also valid so it is okay to post around the wrap point.
|
||||
*
|
||||
* For reads, this is the current generation number. Valid descriptors
|
||||
* will have the inverse of this generation number.
|
||||
*/
|
||||
uint_reg_t gen : 1;
|
||||
/* Reserved. */
|
||||
uint_reg_t __reserved : 31;
|
||||
#else /* __BIG_ENDIAN__ */
|
||||
uint_reg_t __reserved : 31;
|
||||
uint_reg_t gen : 1;
|
||||
uint_reg_t count : 16;
|
||||
uint_reg_t ring_idx : 16;
|
||||
#endif
|
||||
};
|
||||
|
||||
uint_reg_t word;
|
||||
} MPIPE_EDMA_POST_REGION_VAL_t;
|
||||
|
||||
/*
|
||||
* Load Balancer Bucket Status Data.
|
||||
* Read/Write data for load balancer Bucket-Status Table. 4160 entries
|
||||
* indexed by LBL_INIT_CTL.IDX when LBL_INIT_CTL.STRUCT_SEL is BSTS_TBL
|
||||
*/
|
||||
|
||||
__extension__
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
#ifndef __BIG_ENDIAN__
|
||||
/* NotifRing currently assigned to this bucket. */
|
||||
uint_reg_t notifring : 8;
|
||||
/* Current reference count. */
|
||||
uint_reg_t count : 16;
|
||||
/* Group associated with this bucket. */
|
||||
uint_reg_t group : 5;
|
||||
/* Mode select for this bucket. */
|
||||
uint_reg_t mode : 3;
|
||||
/* Reserved. */
|
||||
uint_reg_t __reserved : 32;
|
||||
#else /* __BIG_ENDIAN__ */
|
||||
uint_reg_t __reserved : 32;
|
||||
uint_reg_t mode : 3;
|
||||
uint_reg_t group : 5;
|
||||
uint_reg_t count : 16;
|
||||
uint_reg_t notifring : 8;
|
||||
#endif
|
||||
};
|
||||
|
||||
uint_reg_t word;
|
||||
} MPIPE_LBL_INIT_DAT_BSTS_TBL_t;
|
||||
#endif /* !defined(__ASSEMBLER__) */
|
||||
|
||||
#endif /* !defined(__ARCH_MPIPE_H__) */
|
||||
42
arch/tile/include/arch/mpipe_constants.h
Normal file
42
arch/tile/include/arch/mpipe_constants.h
Normal file
@@ -0,0 +1,42 @@
|
||||
/*
|
||||
* 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 __ARCH_MPIPE_CONSTANTS_H__
|
||||
#define __ARCH_MPIPE_CONSTANTS_H__
|
||||
|
||||
#define MPIPE_NUM_CLASSIFIERS 10
|
||||
#define MPIPE_CLS_MHZ 1200
|
||||
|
||||
#define MPIPE_NUM_EDMA_RINGS 32
|
||||
|
||||
#define MPIPE_NUM_SGMII_MACS 16
|
||||
#define MPIPE_NUM_XAUI_MACS 4
|
||||
#define MPIPE_NUM_LOOPBACK_CHANNELS 4
|
||||
#define MPIPE_NUM_NON_LB_CHANNELS 28
|
||||
|
||||
#define MPIPE_NUM_IPKT_BLOCKS 1536
|
||||
|
||||
#define MPIPE_NUM_BUCKETS 4160
|
||||
|
||||
#define MPIPE_NUM_NOTIF_RINGS 256
|
||||
|
||||
#define MPIPE_NUM_NOTIF_GROUPS 32
|
||||
|
||||
#define MPIPE_NUM_TLBS_PER_ASID 16
|
||||
#define MPIPE_TLB_IDX_WIDTH 4
|
||||
|
||||
#define MPIPE_MMIO_NUM_SVC_DOM 32
|
||||
|
||||
#endif /* __ARCH_MPIPE_CONSTANTS_H__ */
|
||||
39
arch/tile/include/arch/mpipe_def.h
Normal file
39
arch/tile/include/arch/mpipe_def.h
Normal file
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* 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_MPIPE_DEF_H__
|
||||
#define __ARCH_MPIPE_DEF_H__
|
||||
#define MPIPE_MMIO_ADDR__REGION_SHIFT 26
|
||||
#define MPIPE_MMIO_ADDR__REGION_VAL_CFG 0x0
|
||||
#define MPIPE_MMIO_ADDR__REGION_VAL_IDMA 0x4
|
||||
#define MPIPE_MMIO_ADDR__REGION_VAL_EDMA 0x5
|
||||
#define MPIPE_MMIO_ADDR__REGION_VAL_BSM 0x6
|
||||
#define MPIPE_BSM_REGION_VAL__VA_SHIFT 7
|
||||
#define MPIPE_BSM_INIT_DAT_1__SIZE_VAL_BSZ_128 0x0
|
||||
#define MPIPE_BSM_INIT_DAT_1__SIZE_VAL_BSZ_256 0x1
|
||||
#define MPIPE_BSM_INIT_DAT_1__SIZE_VAL_BSZ_512 0x2
|
||||
#define MPIPE_BSM_INIT_DAT_1__SIZE_VAL_BSZ_1024 0x3
|
||||
#define MPIPE_BSM_INIT_DAT_1__SIZE_VAL_BSZ_1664 0x4
|
||||
#define MPIPE_BSM_INIT_DAT_1__SIZE_VAL_BSZ_4096 0x5
|
||||
#define MPIPE_BSM_INIT_DAT_1__SIZE_VAL_BSZ_10368 0x6
|
||||
#define MPIPE_BSM_INIT_DAT_1__SIZE_VAL_BSZ_16384 0x7
|
||||
#define MPIPE_LBL_INIT_DAT_BSTS_TBL__MODE_VAL_DFA 0x0
|
||||
#define MPIPE_LBL_INIT_DAT_BSTS_TBL__MODE_VAL_FIXED 0x1
|
||||
#define MPIPE_LBL_INIT_DAT_BSTS_TBL__MODE_VAL_ALWAYS_PICK 0x2
|
||||
#define MPIPE_LBL_INIT_DAT_BSTS_TBL__MODE_VAL_STICKY 0x3
|
||||
#define MPIPE_LBL_INIT_DAT_BSTS_TBL__MODE_VAL_STICKY_RAND 0x7
|
||||
#define MPIPE_LBL_NR_STATE__FIRST_WORD 0x2138
|
||||
#endif /* !defined(__ARCH_MPIPE_DEF_H__) */
|
||||
509
arch/tile/include/arch/mpipe_shm.h
Normal file
509
arch/tile/include/arch/mpipe_shm.h
Normal file
File diff suppressed because it is too large
Load Diff
23
arch/tile/include/arch/mpipe_shm_def.h
Normal file
23
arch/tile/include/arch/mpipe_shm_def.h
Normal file
@@ -0,0 +1,23 @@
|
||||
/*
|
||||
* 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_MPIPE_SHM_DEF_H__
|
||||
#define __ARCH_MPIPE_SHM_DEF_H__
|
||||
#define MPIPE_EDMA_DESC_WORD1__C_VAL_UNCHAINED 0x0
|
||||
#define MPIPE_EDMA_DESC_WORD1__C_VAL_CHAINED 0x1
|
||||
#define MPIPE_EDMA_DESC_WORD1__C_VAL_NOT_RDY 0x2
|
||||
#define MPIPE_EDMA_DESC_WORD1__C_VAL_INVALID 0x3
|
||||
#endif /* !defined(__ARCH_MPIPE_SHM_DEF_H__) */
|
||||
72
arch/tile/include/arch/trio.h
Normal file
72
arch/tile/include/arch/trio.h
Normal file
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* 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_TRIO_H__
|
||||
#define __ARCH_TRIO_H__
|
||||
|
||||
#include <arch/abi.h>
|
||||
#include <arch/trio_def.h>
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
/*
|
||||
* Tile PIO Region Configuration - CFG Address Format.
|
||||
* This register describes the address format for PIO accesses when the
|
||||
* associated region is setup with TYPE=CFG.
|
||||
*/
|
||||
|
||||
__extension__
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
#ifndef __BIG_ENDIAN__
|
||||
/* Register Address (full byte address). */
|
||||
uint_reg_t reg_addr : 12;
|
||||
/* Function Number */
|
||||
uint_reg_t fn : 3;
|
||||
/* Device Number */
|
||||
uint_reg_t dev : 5;
|
||||
/* BUS Number */
|
||||
uint_reg_t bus : 8;
|
||||
/* Config Type: 0 for access to directly-attached device. 1 otherwise. */
|
||||
uint_reg_t type : 1;
|
||||
/* Reserved. */
|
||||
uint_reg_t __reserved_0 : 1;
|
||||
/*
|
||||
* MAC select. This must match the configuration in
|
||||
* TILE_PIO_REGION_SETUP.MAC.
|
||||
*/
|
||||
uint_reg_t mac : 2;
|
||||
/* Reserved. */
|
||||
uint_reg_t __reserved_1 : 32;
|
||||
#else /* __BIG_ENDIAN__ */
|
||||
uint_reg_t __reserved_1 : 32;
|
||||
uint_reg_t mac : 2;
|
||||
uint_reg_t __reserved_0 : 1;
|
||||
uint_reg_t type : 1;
|
||||
uint_reg_t bus : 8;
|
||||
uint_reg_t dev : 5;
|
||||
uint_reg_t fn : 3;
|
||||
uint_reg_t reg_addr : 12;
|
||||
#endif
|
||||
};
|
||||
|
||||
uint_reg_t word;
|
||||
} TRIO_TILE_PIO_REGION_SETUP_CFG_ADDR_t;
|
||||
#endif /* !defined(__ASSEMBLER__) */
|
||||
|
||||
#endif /* !defined(__ARCH_TRIO_H__) */
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user