| 
									
										
										
										
											2005-04-25 11:35:54 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * This file is subject to the terms and conditions of the GNU General Public | 
					
						
							|  |  |  |  * License.  See the file "COPYING" in the main directory of this archive | 
					
						
							|  |  |  |  * for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (c) 2003-2005 Silicon Graphics, Inc. All rights reserved. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef _ASM_IA64_SN_TIO_CA_AGP_PROVIDER_H
 | 
					
						
							|  |  |  | #define _ASM_IA64_SN_TIO_CA_AGP_PROVIDER_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <asm/sn/tioca.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * WAR enables | 
					
						
							|  |  |  |  * Defines for individual WARs. Each is a bitmask of applicable | 
					
						
							|  |  |  |  * part revision numbers. (1 << 1) == rev A, (1 << 2) == rev B, | 
					
						
							|  |  |  |  * (3 << 1) == (rev A or rev B), etc | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define TIOCA_WAR_ENABLED(pv, tioca_common) \
 | 
					
						
							|  |  |  | 	((1 << tioca_common->ca_rev) & pv) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /* TIO:ICE:FRZ:Freezer loses a PIO data ucred on PIO RD RSP with CW error */ | 
					
						
							|  |  |  | #define PV907908 (1 << 1)
 | 
					
						
							|  |  |  |   /* ATI config space problems after BIOS execution starts */ | 
					
						
							|  |  |  | #define PV908234 (1 << 1)
 | 
					
						
							|  |  |  |   /* CA:AGPDMA write request data mismatch with ABC1CL merge */ | 
					
						
							|  |  |  | #define PV895469 (1 << 1)
 | 
					
						
							| 
									
										
										
										
											2006-06-30 18:27:16 +02:00
										 |  |  |   /* TIO:CA TLB invalidate of written GART entries possibly not occurring in CA*/ | 
					
						
							| 
									
										
										
										
											2005-04-25 11:35:54 -07:00
										 |  |  | #define PV910244 (1 << 1)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct tioca_dmamap{ | 
					
						
							|  |  |  | 	struct list_head	cad_list;	/* headed by ca_list */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	dma_addr_t		cad_dma_addr;	/* Linux dma handle */ | 
					
						
							|  |  |  | 	uint			cad_gart_entry; /* start entry in ca_gart_pagemap */ | 
					
						
							|  |  |  | 	uint			cad_gart_size;	/* #entries for this map */ | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Kernel only fields.  Prom may look at this stuff for debugging only. | 
					
						
							|  |  |  |  * Access this structure through the ca_kernel_private ptr. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct tioca_common ; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct tioca_kernel { | 
					
						
							|  |  |  | 	struct tioca_common	*ca_common;	/* tioca this belongs to */ | 
					
						
							|  |  |  | 	struct list_head	ca_list;	/* list of all ca's */ | 
					
						
							|  |  |  | 	struct list_head	ca_dmamaps; | 
					
						
							|  |  |  | 	spinlock_t		ca_lock;	/* Kernel lock */ | 
					
						
							|  |  |  | 	cnodeid_t		ca_closest_node; | 
					
						
							|  |  |  | 	struct list_head	*ca_devices;	/* bus->devices */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * General GART stuff | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2006-01-16 19:54:40 -08:00
										 |  |  | 	u64	ca_ap_size;		/* size of aperature in bytes */ | 
					
						
							|  |  |  | 	u32	ca_gart_entries;	/* # u64 entries in gart */ | 
					
						
							|  |  |  | 	u32	ca_ap_pagesize; 	/* aperature page size in bytes */ | 
					
						
							|  |  |  | 	u64	ca_ap_bus_base; 	/* bus address of CA aperature */ | 
					
						
							|  |  |  | 	u64	ca_gart_size;		/* gart size in bytes */ | 
					
						
							|  |  |  | 	u64	*ca_gart;		/* gart table vaddr */ | 
					
						
							|  |  |  | 	u64	ca_gart_coretalk_addr;	/* gart coretalk addr */ | 
					
						
							|  |  |  | 	u8		ca_gart_iscoherent;	/* used in tioca_tlbflush */ | 
					
						
							| 
									
										
										
										
											2005-04-25 11:35:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* PCI GART convenience values */ | 
					
						
							| 
									
										
										
										
											2006-01-16 19:54:40 -08:00
										 |  |  | 	u64	ca_pciap_base;		/* pci aperature bus base address */ | 
					
						
							|  |  |  | 	u64	ca_pciap_size;		/* pci aperature size (bytes) */ | 
					
						
							|  |  |  | 	u64	ca_pcigart_base;	/* gfx GART bus base address */ | 
					
						
							|  |  |  | 	u64	*ca_pcigart;		/* gfx GART vm address */ | 
					
						
							|  |  |  | 	u32	ca_pcigart_entries; | 
					
						
							|  |  |  | 	u32	ca_pcigart_start;	/* PCI start index in ca_gart */ | 
					
						
							| 
									
										
										
										
											2005-04-25 11:35:54 -07:00
										 |  |  | 	void		*ca_pcigart_pagemap; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* AGP GART convenience values */ | 
					
						
							| 
									
										
										
										
											2006-01-16 19:54:40 -08:00
										 |  |  | 	u64	ca_gfxap_base;		/* gfx aperature bus base address */ | 
					
						
							|  |  |  | 	u64	ca_gfxap_size;		/* gfx aperature size (bytes) */ | 
					
						
							|  |  |  | 	u64	ca_gfxgart_base;	/* gfx GART bus base address */ | 
					
						
							|  |  |  | 	u64	*ca_gfxgart;		/* gfx GART vm address */ | 
					
						
							|  |  |  | 	u32	ca_gfxgart_entries; | 
					
						
							|  |  |  | 	u32	ca_gfxgart_start;	/* agpgart start index in ca_gart */ | 
					
						
							| 
									
										
										
										
											2005-04-25 11:35:54 -07:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Common tioca info shared between kernel and prom | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * DO NOT CHANGE THIS STRUCT WITHOUT MAKING CORRESPONDING CHANGES | 
					
						
							|  |  |  |  * TO THE PROM VERSION. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct tioca_common { | 
					
						
							|  |  |  | 	struct pcibus_bussoft	ca_common;	/* common pciio header */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-16 19:54:40 -08:00
										 |  |  | 	u32		ca_rev; | 
					
						
							|  |  |  | 	u32		ca_closest_nasid; | 
					
						
							| 
									
										
										
										
											2005-04-25 11:35:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-16 19:54:40 -08:00
										 |  |  | 	u64		ca_prom_private; | 
					
						
							|  |  |  | 	u64		ca_kernel_private; | 
					
						
							| 
									
										
										
										
											2005-04-25 11:35:54 -07:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * tioca_paddr_to_gart - Convert an SGI coretalk address to a CA GART entry | 
					
						
							|  |  |  |  * @paddr: page address to convert | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Convert a system [coretalk] address to a GART entry.  GART entries are | 
					
						
							|  |  |  |  * formed using the following: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *     data = ( (1<<63) |  ( (REMAP_NODE_ID << 40) | (MD_CHIPLET_ID << 38) |  | 
					
						
							|  |  |  |  * (REMAP_SYS_ADDR) ) >> 12 ) | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * DATA written to 1 GART TABLE Entry in system memory is remapped system | 
					
						
							|  |  |  |  * addr for 1 page  | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The data is for coretalk address format right shifted 12 bits with a | 
					
						
							|  |  |  |  * valid bit. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *	GART_TABLE_ENTRY [ 25:0 ]  -- REMAP_SYS_ADDRESS[37:12]. | 
					
						
							|  |  |  |  *	GART_TABLE_ENTRY [ 27:26 ] -- SHUB MD chiplet id. | 
					
						
							|  |  |  |  *	GART_TABLE_ENTRY [ 41:28 ] -- REMAP_NODE_ID. | 
					
						
							|  |  |  |  *	GART_TABLE_ENTRY [ 63 ]    -- Valid Bit  | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | static inline u64 | 
					
						
							|  |  |  | tioca_paddr_to_gart(unsigned long paddr) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * We are assuming right now that paddr already has the correct | 
					
						
							|  |  |  | 	 * format since the address from xtalk_dmaXXX should already have | 
					
						
							|  |  |  | 	 * NODE_ID, CHIPLET_ID, and SYS_ADDR in the correct locations. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return ((paddr) >> 12) | (1UL << 63); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * tioca_physpage_to_gart - Map a host physical page for SGI CA based DMA | 
					
						
							|  |  |  |  * @page_addr: system page address to map | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline unsigned long | 
					
						
							| 
									
										
										
										
											2006-01-16 19:54:40 -08:00
										 |  |  | tioca_physpage_to_gart(u64 page_addr) | 
					
						
							| 
									
										
										
										
											2005-04-25 11:35:54 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2006-01-16 19:54:40 -08:00
										 |  |  | 	u64 coretalk_addr; | 
					
						
							| 
									
										
										
										
											2005-04-25 11:35:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	coretalk_addr = PHYS_TO_TIODMA(page_addr); | 
					
						
							|  |  |  | 	if (!coretalk_addr) { | 
					
						
							|  |  |  | 		return 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return tioca_paddr_to_gart(coretalk_addr); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * tioca_tlbflush - invalidate cached SGI CA GART TLB entries | 
					
						
							|  |  |  |  * @tioca_kernel: CA context  | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Invalidate tlb entries for a given CA GART.  Main complexity is to account | 
					
						
							|  |  |  |  * for revA bug. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | static inline void | 
					
						
							|  |  |  | tioca_tlbflush(struct tioca_kernel *tioca_kernel) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2006-01-16 19:54:40 -08:00
										 |  |  | 	volatile u64 tmp; | 
					
						
							| 
									
										
										
										
											2006-10-10 22:46:27 +01:00
										 |  |  | 	volatile struct tioca __iomem *ca_base; | 
					
						
							| 
									
										
										
										
											2005-04-25 11:35:54 -07:00
										 |  |  | 	struct tioca_common *tioca_common; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	tioca_common = tioca_kernel->ca_common; | 
					
						
							| 
									
										
										
										
											2006-10-10 22:46:27 +01:00
										 |  |  | 	ca_base = (struct tioca __iomem *)tioca_common->ca_common.bs_base; | 
					
						
							| 
									
										
										
										
											2005-04-25 11:35:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * Explicit flushes not needed if GART is in cached mode | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	if (tioca_kernel->ca_gart_iscoherent) { | 
					
						
							|  |  |  | 		if (TIOCA_WAR_ENABLED(PV910244, tioca_common)) { | 
					
						
							|  |  |  | 			/*
 | 
					
						
							|  |  |  | 			 * PV910244:  RevA CA needs explicit flushes. | 
					
						
							|  |  |  | 			 * Need to put GART into uncached mode before | 
					
						
							|  |  |  | 			 * flushing otherwise the explicit flush is ignored. | 
					
						
							|  |  |  | 			 * | 
					
						
							|  |  |  | 			 * Alternate WAR would be to leave GART cached and | 
					
						
							|  |  |  | 			 * touch every CL aligned GART entry. | 
					
						
							|  |  |  | 			 */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-09-06 13:03:51 -05:00
										 |  |  | 			__sn_clrq_relaxed(&ca_base->ca_control2, CA_GART_MEM_PARAM); | 
					
						
							|  |  |  | 			__sn_setq_relaxed(&ca_base->ca_control2, CA_GART_FLUSH_TLB); | 
					
						
							|  |  |  | 			__sn_setq_relaxed(&ca_base->ca_control2, | 
					
						
							|  |  |  | 			    (0x2ull << CA_GART_MEM_PARAM_SHFT)); | 
					
						
							|  |  |  | 			tmp = __sn_readq_relaxed(&ca_base->ca_control2); | 
					
						
							| 
									
										
										
										
											2005-04-25 11:35:54 -07:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/*
 | 
					
						
							|  |  |  | 	 * Gart in uncached mode ... need an explicit flush. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-09-06 13:03:51 -05:00
										 |  |  | 	__sn_setq_relaxed(&ca_base->ca_control2, CA_GART_FLUSH_TLB); | 
					
						
							|  |  |  | 	tmp = __sn_readq_relaxed(&ca_base->ca_control2); | 
					
						
							| 
									
										
										
										
											2005-04-25 11:35:54 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-01-16 19:54:40 -08:00
										 |  |  | extern u32	tioca_gart_found; | 
					
						
							| 
									
										
										
										
											2005-05-10 12:40:00 -07:00
										 |  |  | extern struct list_head tioca_list; | 
					
						
							| 
									
										
										
										
											2005-04-25 11:35:54 -07:00
										 |  |  | extern int tioca_init_provider(void); | 
					
						
							|  |  |  | extern void tioca_fastwrite_enable(struct tioca_kernel *tioca_kern); | 
					
						
							|  |  |  | #endif /* _ASM_IA64_SN_TIO_CA_AGP_PROVIDER_H */
 |