Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 21426
b: refs/heads/master
c: 3833789
h: refs/heads/master
v: v3
  • Loading branch information
David S. Miller committed Mar 20, 2006
1 parent 6512351 commit 5e9d9e8
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 9 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: cf627156c450cd5a0741b31f55181db3400d4887
refs/heads/master: 3833789bb2e15eb85fad296d8fb40f1437925645
41 changes: 33 additions & 8 deletions trunk/arch/sparc64/kernel/pci_sun4v.c
Original file line number Diff line number Diff line change
Expand Up @@ -776,22 +776,22 @@ static void pci_sun4v_iommu_init(struct pci_pbm_info *pbm)
probe_existing_entries(pbm, iommu);
}

static void pci_sun4v_pbm_init(struct pci_controller_info *p, int prom_node)
static void pci_sun4v_pbm_init(struct pci_controller_info *p, int prom_node, unsigned int devhandle)
{
struct pci_pbm_info *pbm;
struct linux_prom64_registers regs;
unsigned int busrange[2];
int err;
int err, i;

/* XXX */
pbm = &p->pbm_A;
if (devhandle & 0x40)
pbm = &p->pbm_B;
else
pbm = &p->pbm_A;

pbm->parent = p;
pbm->prom_node = prom_node;
pbm->pci_first_slot = 1;

prom_getproperty(prom_node, "reg", (char *)&regs, sizeof(regs));
pbm->devhandle = (regs.phys_addr >> 32UL) & 0x0fffffff;
pbm->devhandle = devhandle;

sprintf(pbm->name, "SUN4V-PCI%d PBM%c",
p->index, (pbm == &p->pbm_A ? 'A' : 'B'));
Expand All @@ -813,6 +813,12 @@ static void pci_sun4v_pbm_init(struct pci_controller_info *p, int prom_node)
pbm->num_pbm_ranges =
(err / sizeof(struct linux_prom_pci_ranges));

/* Mask out the top 8 bits of the ranges, leaving the real
* physical address.
*/
for (i = 0; i < pbm->num_pbm_ranges; i++)
pbm->pbm_ranges[i].parent_phys_hi &= 0x0fffffff;

pci_sun4v_determine_mem_io_space(pbm);
pbm_register_toplevel_resources(p, pbm);

Expand Down Expand Up @@ -851,6 +857,25 @@ void sun4v_pci_init(int node, char *model_name)
{
struct pci_controller_info *p;
struct pci_iommu *iommu;
struct linux_prom64_registers regs;
unsigned int devhandle;

prom_getproperty(node, "reg", (char *)&regs, sizeof(regs));
devhandle = (regs.phys_addr >> 32UL) & 0x0fffffff;;

for (p = pci_controller_root; p; p = p->next) {
struct pci_pbm_info *pbm;

if (p->pbm_A.prom_node && p->pbm_B.prom_node)
continue;

pbm = (p->pbm_A.prom_node ?
&p->pbm_A :
&p->pbm_B);

if (pbm->devhandle == (devhandle ^ 0x40))
pci_sun4v_pbm_init(p, node, devhandle);
}

p = kmalloc(sizeof(struct pci_controller_info), GFP_ATOMIC);
if (!p) {
Expand Down Expand Up @@ -892,7 +917,7 @@ void sun4v_pci_init(int node, char *model_name)
*/
pci_memspace_mask = 0x7fffffffUL;

pci_sun4v_pbm_init(p, node);
pci_sun4v_pbm_init(p, node, devhandle);

prom_printf("sun4v_pci_init: Implement me.\n");
prom_halt();
Expand Down

0 comments on commit 5e9d9e8

Please sign in to comment.