[IA64-SGI] Older PROM WAR for device flush code
Work-around to temporarily support older PROMs with new flush device code. This code allows systems running older PROMs to continue to run on the new kernel base until a new official PROM is released. Signed-off-by: Prarit Bhargava <prarit@sgi.com> Acked-by: Jes Sorensen <jes@sgi.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
This commit is contained in:
parent
2664b25051
commit
5f7f5b0c99
|
@ -51,6 +51,15 @@ struct sn_flush_device_kernel {
|
||||||
struct sn_flush_device_common *common;
|
struct sn_flush_device_common *common;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* 01/16/06 This struct is the old PROM/kernel struct and needs to be included
|
||||||
|
* for older official PROMs to function on the new kernel base. This struct
|
||||||
|
* will be removed when the next official PROM release occurs. */
|
||||||
|
|
||||||
|
struct sn_flush_device_war {
|
||||||
|
struct sn_flush_device_common common;
|
||||||
|
u32 filler; /* older PROMs expect the default size of a spinlock_t */
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* **widget_p - Used as an array[wid_num][device] of sn_flush_device_kernel.
|
* **widget_p - Used as an array[wid_num][device] of sn_flush_device_kernel.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -165,8 +165,45 @@ sn_pcidev_info_get(struct pci_dev *dev)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Older PROM flush WAR
|
||||||
|
*
|
||||||
|
* 01/16/06 -- This war will be in place until a new official PROM is released.
|
||||||
|
* Additionally note that the struct sn_flush_device_war also has to be
|
||||||
|
* removed from arch/ia64/sn/include/xtalk/hubdev.h
|
||||||
|
*/
|
||||||
|
static u8 war_implemented = 0;
|
||||||
|
|
||||||
|
static void sn_device_fixup_war(u64 nasid, u64 widget, int device,
|
||||||
|
struct sn_flush_device_common *common)
|
||||||
|
{
|
||||||
|
struct sn_flush_device_war *war_list;
|
||||||
|
struct sn_flush_device_war *dev_entry;
|
||||||
|
struct ia64_sal_retval isrv = {0,0,0,0};
|
||||||
|
|
||||||
|
if (!war_implemented) {
|
||||||
|
printk(KERN_WARNING "PROM version < 4.50 -- implementing old "
|
||||||
|
"PROM flush WAR\n");
|
||||||
|
war_implemented = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
war_list = kzalloc(DEV_PER_WIDGET * sizeof(*war_list), GFP_KERNEL);
|
||||||
|
if (!war_list)
|
||||||
|
BUG();
|
||||||
|
|
||||||
|
SAL_CALL_NOLOCK(isrv, SN_SAL_IOIF_GET_WIDGET_DMAFLUSH_LIST,
|
||||||
|
nasid, widget, __pa(war_list), 0, 0, 0 ,0);
|
||||||
|
if (isrv.status)
|
||||||
|
panic("sn_device_fixup_war failed: %s\n",
|
||||||
|
ia64_sal_strerror(isrv.status));
|
||||||
|
|
||||||
|
dev_entry = war_list + device;
|
||||||
|
memcpy(common,dev_entry, sizeof(*common));
|
||||||
|
|
||||||
|
kfree(war_list);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* sn_fixup_ionodes() - This routine initializes the HUB data strcuture for
|
* sn_fixup_ionodes() - This routine initializes the HUB data strcuture for
|
||||||
* each node in the system.
|
* each node in the system.
|
||||||
*/
|
*/
|
||||||
static void sn_fixup_ionodes(void)
|
static void sn_fixup_ionodes(void)
|
||||||
|
@ -246,8 +283,19 @@ static void sn_fixup_ionodes(void)
|
||||||
widget,
|
widget,
|
||||||
device,
|
device,
|
||||||
(u64)(dev_entry->common));
|
(u64)(dev_entry->common));
|
||||||
if (status)
|
if (status) {
|
||||||
BUG();
|
if (sn_sal_rev() < 0x0450) {
|
||||||
|
/* shortlived WAR for older
|
||||||
|
* PROM images
|
||||||
|
*/
|
||||||
|
sn_device_fixup_war(nasid,
|
||||||
|
widget,
|
||||||
|
device,
|
||||||
|
dev_entry->common);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
BUG();
|
||||||
|
}
|
||||||
|
|
||||||
spin_lock_init(&dev_entry->sfdl_flush_lock);
|
spin_lock_init(&dev_entry->sfdl_flush_lock);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue