fc3fb71c3e
This adds to the 32 bits PCI code some flags, replacing the old pci_assign_all_busses global, that allow us to control various aspects of the PCI probing, such as whether to re-assign all resources or not, or to not try to assign anything at all. This also adds the flag x86 already has to avoid ISA alignment on bridges that don't have ISA forwarding enabled (no legacy devices on the top level bus) and sets it for PowerMacs. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
66 lines
2 KiB
C
66 lines
2 KiB
C
/*
|
|
* Functions for setting up and using a MPC106 northbridge
|
|
* Extracted from arch/powerpc/platforms/powermac/pci.c.
|
|
*
|
|
* Copyright (C) 2003 Benjamin Herrenschmuidt (benh@kernel.crashing.org)
|
|
* Copyright (C) 1997 Paul Mackerras (paulus@samba.org)
|
|
*
|
|
* 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; either version
|
|
* 2 of the License, or (at your option) any later version.
|
|
*/
|
|
#include <linux/kernel.h>
|
|
#include <linux/pci.h>
|
|
#include <linux/init.h>
|
|
|
|
#include <asm/io.h>
|
|
#include <asm/prom.h>
|
|
#include <asm/pci-bridge.h>
|
|
#include <asm/grackle.h>
|
|
|
|
#define GRACKLE_CFA(b, d, o) (0x80 | ((b) << 8) | ((d) << 16) \
|
|
| (((o) & ~3) << 24))
|
|
|
|
#define GRACKLE_PICR1_STG 0x00000040
|
|
#define GRACKLE_PICR1_LOOPSNOOP 0x00000010
|
|
|
|
/* N.B. this is called before bridges is initialized, so we can't
|
|
use grackle_pcibios_{read,write}_config_dword. */
|
|
static inline void grackle_set_stg(struct pci_controller* bp, int enable)
|
|
{
|
|
unsigned int val;
|
|
|
|
out_be32(bp->cfg_addr, GRACKLE_CFA(0, 0, 0xa8));
|
|
val = in_le32(bp->cfg_data);
|
|
val = enable? (val | GRACKLE_PICR1_STG) :
|
|
(val & ~GRACKLE_PICR1_STG);
|
|
out_be32(bp->cfg_addr, GRACKLE_CFA(0, 0, 0xa8));
|
|
out_le32(bp->cfg_data, val);
|
|
(void)in_le32(bp->cfg_data);
|
|
}
|
|
|
|
static inline void grackle_set_loop_snoop(struct pci_controller *bp, int enable)
|
|
{
|
|
unsigned int val;
|
|
|
|
out_be32(bp->cfg_addr, GRACKLE_CFA(0, 0, 0xa8));
|
|
val = in_le32(bp->cfg_data);
|
|
val = enable? (val | GRACKLE_PICR1_LOOPSNOOP) :
|
|
(val & ~GRACKLE_PICR1_LOOPSNOOP);
|
|
out_be32(bp->cfg_addr, GRACKLE_CFA(0, 0, 0xa8));
|
|
out_le32(bp->cfg_data, val);
|
|
(void)in_le32(bp->cfg_data);
|
|
}
|
|
|
|
void __init setup_grackle(struct pci_controller *hose)
|
|
{
|
|
setup_indirect_pci(hose, 0xfec00000, 0xfee00000, 0);
|
|
if (machine_is_compatible("PowerMac1,1"))
|
|
ppc_pci_flags |= PPC_PCI_REASSIGN_ALL_BUS;
|
|
if (machine_is_compatible("AAPL,PowerBook1998"))
|
|
grackle_set_loop_snoop(hose, 1);
|
|
#if 0 /* Disabled for now, HW problems ??? */
|
|
grackle_set_stg(hose, 1);
|
|
#endif
|
|
}
|