[U-Boot] [PATCH 14/15] RFC: x86: minnowmax: Add interrupt routing setup
Bin Meng
bmeng.cn at gmail.com
Wed Jul 29 03:08:10 CEST 2015
Hi Simon,
On Wed, Jul 29, 2015 at 8:48 AM, Simon Glass <sjg at chromium.org> wrote:
> Hi Bin,
>
> On 28 July 2015 at 18:46, Bin Meng <bmeng.cn at gmail.com> wrote:
>> Hi Simon,
>>
>> On Wed, Jul 29, 2015 at 8:42 AM, Simon Glass <sjg at chromium.org> wrote:
>>> Hi Bin,
>>>
>>> On 28 July 2015 at 18:40, Bin Meng <bmeng.cn at gmail.com> wrote:
>>>> Hi Simon,
>>>>
>>>> On Tue, Jul 28, 2015 at 7:58 PM, Simon Glass <sjg at chromium.org> wrote:
>>>>> Hi Bin,
>>>>>
>>>>> On 28 July 2015 at 01:50, Bin Meng <bmeng.cn at gmail.com> wrote:
>>>>>>
>>>>>> Hi Simon,
>>>>>>
>>>>>> On Tue, Jul 28, 2015 at 5:47 AM, Simon Glass <sjg at chromium.org> wrote:
>>>>>> > At present minnowmax does not correct set up PCI interrupts. This should be
>>>>>> > done in U-Boot so that devices work correctly in Linux.
>>>>>> >
>>>>>> > Note: This code needs to make use of the recent pirq_routing work. It does
>>>>>> > not seem to support all the required features, so this RFC will hopefully
>>>>>>
>>>>>> What features are missing in the existing PIRQ codes? When I did the
>>>>>> PIRQ support, I checked both TunnelCreek and BayTrail chipset
>>>>>> datasheet, and found the only difference seems to be the pci
>>>>>> configuration space vs. memory-mapped IBASE where the pci irq routing
>>>>>> registers reside.
>>>>>
>>>>> I see that each PCI device can be assigned four routes, making up a
>>>>> 16-bit register. But the code I see in pirq_assign_req() only assigns
>>>>> a single one, using a byte register.
>>>>>
>>>>
>>>> No, the pci irq routing register is still a 8-bit register on
>>>> BayTrail, where pirq_assign_irq() programs. The 16-bit register you
>>>> mentioned should be done in the platform codes. See
>>>> arch/x86/cpu/queensbay/tnc.c::cpu_irq_init(). By the way actually we
>>>> can leave those register programmed as they have the optimized default
>>>> values for all pci devices after power up, unless we intentionally
>>>> want to change them.
>>>
>>> What do you mean by 'leave those register programmed'?
>>>
>>
>> I mean their default value is normally OK, like INTA maps PIRQA, INTB
>> maps PIRQB, INTC maps PIRQC and INTD maps PIRQD.
>
> OK, so drop writing to the pirq registers?
You might need check if BayTrail FSP does any programming on these
registers. On Intel Crown Bay, I checked those values are the same
values as documented in the TunnelCreek datasheet.
> Should I program the 16-bit registers? If so, I will need to extend
> the device tree binding, won't I?
When I did the device tree binding changes, I did not convert these
registers to use device tree, because their offsets, not like the
routing registers as programmed in pirq_assign_irq(), is really
platform specific thing and does not seem to have a good formula to
calculate its offset (it varies from platform to platform). I
previously wanted to create some device bindings like below, but I
think they are really ugly so I did not go that way:
irq-router at 1f,0 {
reg = <0x0000f800 0 0 0 0>;
compatible = "intel,irq-router";
......
dev0-intx-offset = <0x2040>;
dev0-intx-value = <PIRQA PIRQB PIRQC PIRQD>;
dev2-intx-offset = <0x2048>;
dev2-intx-value = <PIRQA PIRQB PIRQC PIRQD>;
dev4-intx-offset = <0x2060>;
dev4-intx-value = <PIRQA PIRQB PIRQC PIRQD>;
dev26-intx-offset = <0x20a0>;
dev26-intx-value = <PIRQA PIRQB PIRQC PIRQD>;
dev31-intx-offset = <0x20c0>;
dev31-intx-value = <PIRQA PIRQB PIRQC PIRQD>;
......
Sorry I cannot find a better way to describe this in device tree, so I
chose to implement directly in the cpu_irq_init() to program these
registers.
>
> Sorry my understanding is limited on this - and I'd like to use your
> generic code if possible.
>
Yes, let's try to use the existing codes. If needed, we can have some
patches to support new platforms.
Regards,
Bin
More information about the U-Boot
mailing list