All of lore.kernel.org
 help / color / mirror / Atom feed
From: Wang Jian <lark@linux.net.cn>
To: linuxppc-dev@ozlabs.org
Subject: mpc8541 pci1 ioport allocation address space problem
Date: Sat, 20 Sep 2008 19:16:25 +0800	[thread overview]
Message-ID: <48D4DB89.3040607@linux.net.cn> (raw)

[-- Attachment #1: Type: text/plain, Size: 2413 bytes --]

Hi,

Here I have a 8541 dev board, with 2 e1000 attached to pci0 and a
homebrewed addon board inserted into pci1. I am trying to make it work
under 2.6.26-rc8 (2.6.26 broken so I am working at rc8).

The ioports allocation reads

$ cat /proc/ioports
00000000-000fffff : /pci@e0008000
  00001000-0000103f : 0000:00:0a.0
  00001040-0000107f : 0000:00:0b.0
ffefe000-ffffdfff : /pci@e0009000
  ffeff000-ffeff00f : 0001:01:0a.0
  ffeff010-ffeff01f : 0001:01:0b.0
  ffeff020-ffeff02f : 0001:01:0c.0
  ffeff030-ffeff03f : 0001:01:0d.0

The port allocation for pci1 looks ridiculous. The addon board doesn't work.

After poking around, I find pci_process_bridge_OF_ranges() in
arch/powerpc/kernel/pci-common.c

--snip--
if (primary)
        isa_io_base = (unsigned long)hose->io_base_virt;
--snip--

then fixup_resource(), _IO_BASE = isa_io_base. fix_resource will use
isa_io_base as base address to assign io port address space.

This is reasonable, but on my board, pci1's hose->io_base_virt is
smaller than pci0's. This lead to

[    0.064214] PCI:0000:00:0a.0 Resource 4
0000000000001000-000000000000103f [20101] fixup...
[    0.064224] fixup_resource() offset=00000000, io_base_virt=fdeb4000,
_IO_BASE=fdeb4000, io_base_phys=e2000000
[    0.064232] PCI:0000:00:0a.0            0000000000001000-000000000000103f

[    0.065129] PCI:0001:01:0a.0 Resource 2
0000000000001000-000000000000100f [20101] fixup...
[    0.065139] fixup_resource() offset=ffefe000, io_base_virt=fddb2000,
_IO_BASE=fdeb4000, io_base_phys=e3000000
[    0.065147] PCI:0001:01:0a.0            00000000ffeff000-00000000ffeff00f

offset = fddb2000 - fdeb4000 = ffefe000

So far, I think the workaround is to replace the code above with

--snip--
if (!isa_io_base)
        isa_io_base = (unsigned long)hose->io_base_virt;
else if ((unsigned long)hose->io_base_virt < isa_io_base)
        isa_io_base = (unsigned long)hose->io_base_virt;
--snip--

Then ioport allocation reads (But I haven't test if it works)

$ cat /proc/ioports
00000000-000fffff : /pci@e0009000
  00001000-0000100f : 0001:01:0a.0
  00001010-0000101f : 0001:01:0b.0
  00001020-0000102f : 0001:01:0c.0
  00001030-0000103f : 0001:01:0d.0
00102000-00201fff : /pci@e0008000
  00103000-0010303f : 0000:00:0a.0
  00103040-0010307f : 0000:00:0b.0

Can someone gives a better generic fix for this?

PS: I attach the kernel log (without workaround) for reference. I added
some printk code.


[-- Attachment #2: ppc_pci.txt --]
[-- Type: text/plain, Size: 6113 bytes --]

[    0.064140] PCI: Found 0000:00:0a.0 [8086/1076] 000200 00
[    0.064157] pci_read_bases(): IO: (0000:00:0a.0) l=00001001,start=00001000,flag=00000000
[    0.064172] pci 0000:00:0a.0: calling 0xc01e9f98
[    0.064182] PCI:0000:00:0a.0 Resource 0 0000000080000000-000000008001ffff [20204] fixup...
[    0.064190] PCI:0000:00:0a.0            0000000080000000-000000008001ffff
[    0.064198] PCI:0000:00:0a.0 Resource 2 0000000080020000-000000008002ffff [20204] fixup...
[    0.064206] PCI:0000:00:0a.0            0000000080020000-000000008002ffff
[    0.064214] PCI:0000:00:0a.0 Resource 4 0000000000001000-000000000000103f [20101] fixup...
[    0.064224] fixup_resource() offset=00000000, io_base_virt=fdeb4000, _IO_BASE=fdeb4000, io_base_phys=e2000000
[    0.064232] PCI:0000:00:0a.0            0000000000001000-000000000000103f
[    0.064241] PCI:0000:00:0a.0 Resource 6 0000000000000000-000000000000ffff [27200] is unassigned
[    0.064268] PCI: Found 0000:00:0b.0 [8086/1076] 000200 00
[    0.064284] pci_read_bases(): IO: (0000:00:0b.0) l=00001041,start=00001040,flag=00000000
[    0.064300] pci 0000:00:0b.0: calling 0xc01e9f98
[    0.064309] PCI:0000:00:0b.0 Resource 0 0000000080040000-000000008005ffff [20204] fixup...
[    0.064316] PCI:0000:00:0b.0            0000000080040000-000000008005ffff
[    0.064325] PCI:0000:00:0b.0 Resource 2 0000000080060000-000000008006ffff [20204] fixup...
[    0.064353] PCI:0000:00:0b.0            0000000080060000-000000008006ffff
[    0.064362] PCI:0000:00:0b.0 Resource 4 0000000000001040-000000000000107f [20101] fixup...
[    0.064371] fixup_resource() offset=00000000, io_base_virt=fdeb4000, _IO_BASE=fdeb4000, io_base_phys=e2000000
[    0.064379] PCI:0000:00:0b.0            0000000000001040-000000000000107f
[    0.064388] PCI:0000:00:0b.0 Resource 6 0000000000000000-000000000000ffff [27200] is unassigned
[    0.064408] PCI: Fixups for bus 0000:00
[    0.064413] PCI: Fixup bus 0 (PHB)
[    0.064420] Try to map irq for 0000:00:00.0...
[    0.064447] Try to map irq for 0000:00:0a.0...
[    0.064459]  -> got one, spec 2 cells (0x00000000 0x00000001...) on /soc8541@e0000000/pic@40000
[    0.064478]  -> mapped to linux irq 16
[    0.064482] Try to map irq for 0000:00:0b.0...
[    0.064498]  -> got one, spec 2 cells (0x00000001 0x00000001...) on /soc8541@e0000000/pic@40000
[    0.064510]  -> mapped to linux irq 17
[    0.064517] PCI: Bus scan for 0000:00 returning with max=00
[    0.064973] PCI: Scanning bus 0001:01
[    0.064989] PCI: Found 0001:01:00.0 [1057/000c] 000b20 00
[    0.065011] pci 0001:01:00.0: calling fixup_hide_host_resource_fsl+0x0/0x50
[    0.065024] pci 0001:01:00.0: calling 0xc01e9f98
[    0.065055] PCI: Found 0001:01:0a.0 [104c/a106] 000000 00
[    0.065069] pci_read_bases(): IO: (0001:01:0a.0) l=00001001,start=00001000,flag=00000000
[    0.065087] pci 0001:01:0a.0: calling 0xc01e9f98
[    0.065097] PCI:0001:01:0a.0 Resource 0 00000000a0400000-00000000a07fffff [21208] fixup...
[    0.065105] PCI:0001:01:0a.0            00000000a0400000-00000000a07fffff
[    0.065113] PCI:0001:01:0a.0 Resource 1 00000000a0800000-00000000a0ffffff [20200] fixup...
[    0.065121] PCI:0001:01:0a.0            00000000a0800000-00000000a0ffffff
[    0.065129] PCI:0001:01:0a.0 Resource 2 0000000000001000-000000000000100f [20101] fixup...
[    0.065139] fixup_resource() offset=ffefe000, io_base_virt=fddb2000, _IO_BASE=fdeb4000, io_base_phys=e3000000
[    0.065147] PCI:0001:01:0a.0            00000000ffeff000-00000000ffeff00f
[    0.065169] PCI: Found 0001:01:0b.0 [104c/a106] 000000 00
[    0.065184] pci_read_bases(): IO: (0001:01:0b.0) l=00001011,start=00001010,flag=00000000
[    0.065202] pci 0001:01:0b.0: calling 0xc01e9f98
[    0.065211] PCI:0001:01:0b.0 Resource 0 00000000a1000000-00000000a13fffff [21208] fixup...
[    0.065219] PCI:0001:01:0b.0            00000000a1000000-00000000a13fffff
[    0.065227] PCI:0001:01:0b.0 Resource 1 00000000a1800000-00000000a1ffffff [20200] fixup...
[    0.065235] PCI:0001:01:0b.0            00000000a1800000-00000000a1ffffff
[    0.065243] PCI:0001:01:0b.0 Resource 2 0000000000001010-000000000000101f [20101] fixup...
[    0.065253] fixup_resource() offset=ffefe000, io_base_virt=fddb2000, _IO_BASE=fdeb4000, io_base_phys=e3000000
[    0.065261] PCI:0001:01:0b.0            00000000ffeff010-00000000ffeff01f
[    0.065284] PCI: Found 0001:01:0c.0 [104c/a106] 000000 00
[    0.065298] pci_read_bases(): IO: (0001:01:0c.0) l=00001021,start=00001020,flag=00000000
[    0.065316] pci 0001:01:0c.0: calling 0xc01e9f98
[    0.065325] PCI:0001:01:0c.0 Resource 0 00000000a2000000-00000000a23fffff [21208] fixup...
[    0.065333] PCI:0001:01:0c.0            00000000a2000000-00000000a23fffff
[    0.065341] PCI:0001:01:0c.0 Resource 1 00000000a2800000-00000000a2ffffff [20200] fixup...
[    0.065360] PCI:0001:01:0c.0            00000000a2800000-00000000a2ffffff
[    0.065369] PCI:0001:01:0c.0 Resource 2 0000000000001020-000000000000102f [20101] fixup...
[    0.065378] fixup_resource() offset=ffefe000, io_base_virt=fddb2000, _IO_BASE=fdeb4000, io_base_phys=e3000000
[    0.065387] PCI:0001:01:0c.0            00000000ffeff020-00000000ffeff02f
[    0.065413] PCI: Found 0001:01:0d.0 [104c/a106] 000000 00
[    0.065428] pci_read_bases(): IO: (0001:01:0d.0) l=00001031,start=00001030,flag=00000000
[    0.065447] pci 0001:01:0d.0: calling 0xc01e9f98
[    0.065456] PCI:0001:01:0d.0 Resource 0 00000000a3000000-00000000a33fffff [21208] fixup...
[    0.065464] PCI:0001:01:0d.0            00000000a3000000-00000000a33fffff
[    0.065472] PCI:0001:01:0d.0 Resource 1 00000000a3800000-00000000a3ffffff [20200] fixup...
[    0.065480] PCI:0001:01:0d.0            00000000a3800000-00000000a3ffffff
[    0.065488] PCI:0001:01:0d.0 Resource 2 0000000000001030-000000000000103f [20101] fixup...
[    0.065498] fixup_resource() offset=ffefe000, io_base_virt=fddb2000, _IO_BASE=fdeb4000, io_base_phys=e3000000
[    0.065506] PCI:0001:01:0d.0            00000000ffeff030-00000000ffeff03f
[    0.065527] PCI: Fixups for bus 0001:01

             reply	other threads:[~2008-09-20 11:37 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-09-20 11:16 Wang Jian [this message]
2008-09-21  1:19 ` mpc8541 pci1 ioport allocation address space problem Wang Jian
2008-09-23  6:55   ` Benjamin Herrenschmidt
2008-09-22  5:47 ` Benjamin Herrenschmidt
2008-09-23 14:24   ` Wang Jian
2008-09-23 21:16     ` Benjamin Herrenschmidt

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=48D4DB89.3040607@linux.net.cn \
    --to=lark@linux.net.cn \
    --cc=linuxppc-dev@ozlabs.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.