[PARISC] Create shared <asm/ropes.h> header
Pull out struct sba_device and struct lba_device into a common ropes.h header. Also fold the parisc portion of iosapic.h into this file. (Then delete the useless portion of iosapic.h) Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
This commit is contained in:
parent
b0eecc4da9
commit
1790cf9111
|
@ -146,7 +146,7 @@
|
|||
#include <asm/superio.h>
|
||||
#endif
|
||||
|
||||
#include <asm/iosapic.h>
|
||||
#include <asm/ropes.h>
|
||||
#include "./iosapic_private.h"
|
||||
|
||||
#define MODULE_NAME "iosapic"
|
||||
|
|
|
@ -46,9 +46,9 @@
|
|||
#include <asm/page.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#include <asm/ropes.h>
|
||||
#include <asm/hardware.h> /* for register_parisc_driver() stuff */
|
||||
#include <asm/parisc-device.h>
|
||||
#include <asm/iosapic.h> /* for iosapic_register() */
|
||||
#include <asm/io.h> /* read/write stuff */
|
||||
|
||||
#undef DEBUG_LBA /* general stuff */
|
||||
|
@ -169,44 +169,6 @@
|
|||
#define LBA_PORT_BASE (PCI_F_EXTEND | 0xfee00000UL)
|
||||
static void __iomem *astro_iop_base __read_mostly;
|
||||
|
||||
#define ELROY_HVERS 0x782
|
||||
#define MERCURY_HVERS 0x783
|
||||
#define QUICKSILVER_HVERS 0x784
|
||||
|
||||
static inline int IS_ELROY(struct parisc_device *d)
|
||||
{
|
||||
return (d->id.hversion == ELROY_HVERS);
|
||||
}
|
||||
|
||||
static inline int IS_MERCURY(struct parisc_device *d)
|
||||
{
|
||||
return (d->id.hversion == MERCURY_HVERS);
|
||||
}
|
||||
|
||||
static inline int IS_QUICKSILVER(struct parisc_device *d)
|
||||
{
|
||||
return (d->id.hversion == QUICKSILVER_HVERS);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** lba_device: Per instance Elroy data structure
|
||||
*/
|
||||
struct lba_device {
|
||||
struct pci_hba_data hba;
|
||||
|
||||
spinlock_t lba_lock;
|
||||
void *iosapic_obj;
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
void __iomem * iop_base; /* PA_VIEW - for IO port accessor funcs */
|
||||
#endif
|
||||
|
||||
int flags; /* state/functionality enabled */
|
||||
int hw_rev; /* HW revision of chip */
|
||||
};
|
||||
|
||||
|
||||
static u32 lba_t32;
|
||||
|
||||
/* lba flags */
|
||||
|
|
|
@ -38,6 +38,7 @@
|
|||
#include <linux/proc_fs.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
||||
#include <asm/ropes.h>
|
||||
#include <asm/mckinley.h> /* for proc_mckinley_root */
|
||||
#include <asm/runway.h> /* for proc_runway_root */
|
||||
#include <asm/pdc.h> /* for PDC_MODEL_* */
|
||||
|
@ -46,11 +47,6 @@
|
|||
|
||||
#define MODULE_NAME "SBA"
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
/* depends on proc fs support. But costs CPU performance */
|
||||
#undef SBA_COLLECT_STATS
|
||||
#endif
|
||||
|
||||
/*
|
||||
** The number of debug flags is a clue - this code is fragile.
|
||||
** Don't even think about messing with it unless you have
|
||||
|
@ -89,46 +85,13 @@
|
|||
#define DBG_RES(x...)
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_64BIT)
|
||||
/* "low end" PA8800 machines use ZX1 chipset: PAT PDC and only run 64-bit */
|
||||
#define ZX1_SUPPORT
|
||||
#endif
|
||||
|
||||
#define SBA_INLINE __inline__
|
||||
|
||||
|
||||
/*
|
||||
** The number of pdir entries to "free" before issueing
|
||||
** a read to PCOM register to flush out PCOM writes.
|
||||
** Interacts with allocation granularity (ie 4 or 8 entries
|
||||
** allocated and free'd/purged at a time might make this
|
||||
** less interesting).
|
||||
*/
|
||||
#define DELAYED_RESOURCE_CNT 16
|
||||
|
||||
#define DEFAULT_DMA_HINT_REG 0
|
||||
|
||||
#define ASTRO_RUNWAY_PORT 0x582
|
||||
#define IKE_MERCED_PORT 0x803
|
||||
#define REO_MERCED_PORT 0x804
|
||||
#define REOG_MERCED_PORT 0x805
|
||||
#define PLUTO_MCKINLEY_PORT 0x880
|
||||
|
||||
#define SBA_FUNC_ID 0x0000 /* function id */
|
||||
#define SBA_FCLASS 0x0008 /* function class, bist, header, rev... */
|
||||
|
||||
static inline int IS_ASTRO(struct parisc_device *d) {
|
||||
return d->id.hversion == ASTRO_RUNWAY_PORT;
|
||||
}
|
||||
|
||||
static inline int IS_IKE(struct parisc_device *d) {
|
||||
return d->id.hversion == IKE_MERCED_PORT;
|
||||
}
|
||||
|
||||
static inline int IS_PLUTO(struct parisc_device *d) {
|
||||
return d->id.hversion == PLUTO_MCKINLEY_PORT;
|
||||
}
|
||||
|
||||
#define SBA_FUNC_SIZE 4096 /* SBA configuration function reg set */
|
||||
|
||||
#define ASTRO_IOC_OFFSET (32 * SBA_FUNC_SIZE)
|
||||
|
@ -145,10 +108,6 @@ static inline int IS_PLUTO(struct parisc_device *d) {
|
|||
#define IOC_CTRL_D4 (1 << 11) /* Disable 4-byte coalescing */
|
||||
#define IOC_CTRL_DD (1 << 13) /* Disable distr. LMMIO range coalescing */
|
||||
|
||||
#define MAX_IOC 2 /* per Ike. Pluto/Astro only have 1. */
|
||||
|
||||
#define ROPES_PER_IOC 8 /* per Ike half or Pluto/Astro */
|
||||
|
||||
|
||||
/*
|
||||
** Offsets into MBIB (Function 0 on Ike and hopefully Astro)
|
||||
|
@ -196,9 +155,6 @@ static inline int IS_PLUTO(struct parisc_device *d) {
|
|||
#define IOC_TCNFG 0x318
|
||||
#define IOC_PDIR_BASE 0x320
|
||||
|
||||
/* AGP GART driver looks for this */
|
||||
#define SBA_IOMMU_COOKIE 0x0000badbadc0ffeeUL
|
||||
|
||||
|
||||
/*
|
||||
** IOC supports 4/8/16/64KB page sizes (see TCNFG register)
|
||||
|
@ -228,69 +184,6 @@ static inline int IS_PLUTO(struct parisc_device *d) {
|
|||
#define SBA_PERF_CNT2 0x208
|
||||
#define SBA_PERF_CNT3 0x210
|
||||
|
||||
|
||||
struct ioc {
|
||||
void __iomem *ioc_hpa; /* I/O MMU base address */
|
||||
char *res_map; /* resource map, bit == pdir entry */
|
||||
u64 *pdir_base; /* physical base address */
|
||||
unsigned long ibase; /* pdir IOV Space base - shared w/lba_pci */
|
||||
unsigned long imask; /* pdir IOV Space mask - shared w/lba_pci */
|
||||
#ifdef ZX1_SUPPORT
|
||||
unsigned long iovp_mask; /* help convert IOVA to IOVP */
|
||||
#endif
|
||||
unsigned long *res_hint; /* next avail IOVP - circular search */
|
||||
spinlock_t res_lock;
|
||||
unsigned int res_bitshift; /* from the LEFT! */
|
||||
unsigned int res_size; /* size of resource map in bytes */
|
||||
#ifdef SBA_HINT_SUPPORT
|
||||
/* FIXME : DMA HINTs not used */
|
||||
unsigned long hint_mask_pdir; /* bits used for DMA hints */
|
||||
unsigned int hint_shift_pdir;
|
||||
#endif
|
||||
#if DELAYED_RESOURCE_CNT > 0
|
||||
int saved_cnt;
|
||||
struct sba_dma_pair {
|
||||
dma_addr_t iova;
|
||||
size_t size;
|
||||
} saved[DELAYED_RESOURCE_CNT];
|
||||
#endif
|
||||
|
||||
#ifdef SBA_COLLECT_STATS
|
||||
#define SBA_SEARCH_SAMPLE 0x100
|
||||
unsigned long avg_search[SBA_SEARCH_SAMPLE];
|
||||
unsigned long avg_idx; /* current index into avg_search */
|
||||
unsigned long used_pages;
|
||||
unsigned long msingle_calls;
|
||||
unsigned long msingle_pages;
|
||||
unsigned long msg_calls;
|
||||
unsigned long msg_pages;
|
||||
unsigned long usingle_calls;
|
||||
unsigned long usingle_pages;
|
||||
unsigned long usg_calls;
|
||||
unsigned long usg_pages;
|
||||
#endif
|
||||
|
||||
/* STUFF We don't need in performance path */
|
||||
unsigned int pdir_size; /* in bytes, determined by IOV Space size */
|
||||
};
|
||||
|
||||
struct sba_device {
|
||||
struct sba_device *next; /* list of SBA's in system */
|
||||
struct parisc_device *dev; /* dev found in bus walk */
|
||||
const char *name;
|
||||
void __iomem *sba_hpa; /* base address */
|
||||
spinlock_t sba_lock;
|
||||
unsigned int flags; /* state/functionality enabled */
|
||||
unsigned int hw_rev; /* HW revision of chip */
|
||||
|
||||
struct resource chip_resv; /* MMIO reserved for chip */
|
||||
struct resource iommu_resv; /* MMIO reserved for iommu */
|
||||
|
||||
unsigned int num_ioc; /* number of on-board IOC's */
|
||||
struct ioc ioc[MAX_IOC];
|
||||
};
|
||||
|
||||
|
||||
static struct sba_device *sba_list;
|
||||
|
||||
static unsigned long ioc_needs_fdc = 0;
|
||||
|
|
|
@ -1,53 +0,0 @@
|
|||
/*
|
||||
** This file is private to iosapic driver.
|
||||
** If stuff needs to be used by another driver, move it to a common file.
|
||||
**
|
||||
** WARNING: fields most data structures here are ordered to make sure
|
||||
** they pack nicely for 64-bit compilation. (ie sizeof(long) == 8)
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
** I/O SAPIC init function
|
||||
** Caller knows where an I/O SAPIC is. LBA has an integrated I/O SAPIC.
|
||||
** Call setup as part of per instance initialization.
|
||||
** (ie *not* init_module() function unless only one is present.)
|
||||
** fixup_irq is to initialize PCI IRQ line support and
|
||||
** virtualize pcidev->irq value. To be called by pci_fixup_bus().
|
||||
*/
|
||||
extern void *iosapic_register(unsigned long hpa);
|
||||
extern int iosapic_fixup_irq(void *obj, struct pci_dev *pcidev);
|
||||
|
||||
|
||||
#ifdef __IA64__
|
||||
/*
|
||||
** PA: PIB (Processor Interrupt Block) is handled by Runway bus adapter.
|
||||
** and is hardcoded to 0xfeeNNNN0 where NNNN is id_eid field.
|
||||
**
|
||||
** IA64: PIB is handled by "Local SAPIC" (integrated in the processor).
|
||||
*/
|
||||
struct local_sapic_info {
|
||||
struct local_sapic_info *lsi_next; /* point to next CPU info */
|
||||
int *lsi_cpu_id; /* point to logical CPU id */
|
||||
unsigned long *lsi_id_eid; /* point to IA-64 CPU id */
|
||||
int *lsi_status; /* point to CPU status */
|
||||
void *lsi_private; /* point to special info */
|
||||
};
|
||||
|
||||
/*
|
||||
** "root" data structure which ties everything together.
|
||||
** Should always be able to start with sapic_root and locate
|
||||
** the desired information.
|
||||
*/
|
||||
struct sapic_info {
|
||||
struct sapic_info *si_next; /* info is per cell */
|
||||
int si_cellid; /* cell id */
|
||||
unsigned int si_status; /* status */
|
||||
char *si_pib_base; /* intr blk base address */
|
||||
local_sapic_info_t *si_local_info;
|
||||
io_sapic_info_t *si_io_info;
|
||||
extint_info_t *si_extint_info;/* External Intr info */
|
||||
};
|
||||
|
||||
#endif /* IA64 */
|
||||
|
|
@ -0,0 +1,150 @@
|
|||
#ifndef _ASM_PARISC_ROPES_H_
|
||||
#define _ASM_PARISC_ROPES_H_
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
/* "low end" PA8800 machines use ZX1 chipset: PAT PDC and only run 64-bit */
|
||||
#define ZX1_SUPPORT
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PROC_FS
|
||||
/* depends on proc fs support. But costs CPU performance */
|
||||
#undef SBA_COLLECT_STATS
|
||||
#endif
|
||||
|
||||
/*
|
||||
** The number of pdir entries to "free" before issueing
|
||||
** a read to PCOM register to flush out PCOM writes.
|
||||
** Interacts with allocation granularity (ie 4 or 8 entries
|
||||
** allocated and free'd/purged at a time might make this
|
||||
** less interesting).
|
||||
*/
|
||||
#define DELAYED_RESOURCE_CNT 16
|
||||
|
||||
#define MAX_IOC 2 /* per Ike. Pluto/Astro only have 1. */
|
||||
#define ROPES_PER_IOC 8 /* per Ike half or Pluto/Astro */
|
||||
|
||||
struct ioc {
|
||||
void __iomem *ioc_hpa; /* I/O MMU base address */
|
||||
char *res_map; /* resource map, bit == pdir entry */
|
||||
u64 *pdir_base; /* physical base address */
|
||||
unsigned long ibase; /* pdir IOV Space base - shared w/lba_pci */
|
||||
unsigned long imask; /* pdir IOV Space mask - shared w/lba_pci */
|
||||
#ifdef ZX1_SUPPORT
|
||||
unsigned long iovp_mask; /* help convert IOVA to IOVP */
|
||||
#endif
|
||||
unsigned long *res_hint; /* next avail IOVP - circular search */
|
||||
spinlock_t res_lock;
|
||||
unsigned int res_bitshift; /* from the LEFT! */
|
||||
unsigned int res_size; /* size of resource map in bytes */
|
||||
#ifdef SBA_HINT_SUPPORT
|
||||
/* FIXME : DMA HINTs not used */
|
||||
unsigned long hint_mask_pdir; /* bits used for DMA hints */
|
||||
unsigned int hint_shift_pdir;
|
||||
#endif
|
||||
#if DELAYED_RESOURCE_CNT > 0
|
||||
int saved_cnt;
|
||||
struct sba_dma_pair {
|
||||
dma_addr_t iova;
|
||||
size_t size;
|
||||
} saved[DELAYED_RESOURCE_CNT];
|
||||
#endif
|
||||
|
||||
#ifdef SBA_COLLECT_STATS
|
||||
#define SBA_SEARCH_SAMPLE 0x100
|
||||
unsigned long avg_search[SBA_SEARCH_SAMPLE];
|
||||
unsigned long avg_idx; /* current index into avg_search */
|
||||
unsigned long used_pages;
|
||||
unsigned long msingle_calls;
|
||||
unsigned long msingle_pages;
|
||||
unsigned long msg_calls;
|
||||
unsigned long msg_pages;
|
||||
unsigned long usingle_calls;
|
||||
unsigned long usingle_pages;
|
||||
unsigned long usg_calls;
|
||||
unsigned long usg_pages;
|
||||
#endif
|
||||
/* STUFF We don't need in performance path */
|
||||
unsigned int pdir_size; /* in bytes, determined by IOV Space size */
|
||||
};
|
||||
|
||||
struct sba_device {
|
||||
struct sba_device *next; /* list of SBA's in system */
|
||||
struct parisc_device *dev; /* dev found in bus walk */
|
||||
const char *name;
|
||||
void __iomem *sba_hpa; /* base address */
|
||||
spinlock_t sba_lock;
|
||||
unsigned int flags; /* state/functionality enabled */
|
||||
unsigned int hw_rev; /* HW revision of chip */
|
||||
|
||||
struct resource chip_resv; /* MMIO reserved for chip */
|
||||
struct resource iommu_resv; /* MMIO reserved for iommu */
|
||||
|
||||
unsigned int num_ioc; /* number of on-board IOC's */
|
||||
struct ioc ioc[MAX_IOC];
|
||||
};
|
||||
|
||||
#define ASTRO_RUNWAY_PORT 0x582
|
||||
#define IKE_MERCED_PORT 0x803
|
||||
#define REO_MERCED_PORT 0x804
|
||||
#define REOG_MERCED_PORT 0x805
|
||||
#define PLUTO_MCKINLEY_PORT 0x880
|
||||
|
||||
static inline int IS_ASTRO(struct parisc_device *d) {
|
||||
return d->id.hversion == ASTRO_RUNWAY_PORT;
|
||||
}
|
||||
|
||||
static inline int IS_IKE(struct parisc_device *d) {
|
||||
return d->id.hversion == IKE_MERCED_PORT;
|
||||
}
|
||||
|
||||
static inline int IS_PLUTO(struct parisc_device *d) {
|
||||
return d->id.hversion == PLUTO_MCKINLEY_PORT;
|
||||
}
|
||||
|
||||
#define SBA_IOMMU_COOKIE 0x0000badbadc0ffeeUL
|
||||
|
||||
/*
|
||||
** lba_device: Per instance Elroy data structure
|
||||
*/
|
||||
struct lba_device {
|
||||
struct pci_hba_data hba;
|
||||
|
||||
spinlock_t lba_lock;
|
||||
void *iosapic_obj;
|
||||
|
||||
#ifdef CONFIG_64BIT
|
||||
void __iomem *iop_base; /* PA_VIEW - for IO port accessor funcs */
|
||||
#endif
|
||||
|
||||
int flags; /* state/functionality enabled */
|
||||
int hw_rev; /* HW revision of chip */
|
||||
};
|
||||
|
||||
#define ELROY_HVERS 0x782
|
||||
#define MERCURY_HVERS 0x783
|
||||
#define QUICKSILVER_HVERS 0x784
|
||||
|
||||
static inline int IS_ELROY(struct parisc_device *d) {
|
||||
return (d->id.hversion == ELROY_HVERS);
|
||||
}
|
||||
|
||||
static inline int IS_MERCURY(struct parisc_device *d) {
|
||||
return (d->id.hversion == MERCURY_HVERS);
|
||||
}
|
||||
|
||||
static inline int IS_QUICKSILVER(struct parisc_device *d) {
|
||||
return (d->id.hversion == QUICKSILVER_HVERS);
|
||||
}
|
||||
|
||||
/*
|
||||
** I/O SAPIC init function
|
||||
** Caller knows where an I/O SAPIC is. LBA has an integrated I/O SAPIC.
|
||||
** Call setup as part of per instance initialization.
|
||||
** (ie *not* init_module() function unless only one is present.)
|
||||
** fixup_irq is to initialize PCI IRQ line support and
|
||||
** virtualize pcidev->irq value. To be called by pci_fixup_bus().
|
||||
*/
|
||||
extern void *iosapic_register(unsigned long hpa);
|
||||
extern int iosapic_fixup_irq(void *obj, struct pci_dev *pcidev);
|
||||
|
||||
#endif /*_ASM_PARISC_ROPES_H_*/
|
Loading…
Reference in New Issue