lkml.org 
[lkml]   [2020]   [Jul]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
SubjectRe: [PATCH 2/5] MIPS: Loongson64: Process ISA Node in DeviceTree
From
Date


在 2020/7/20 下午7:44, Huacai Chen 写道:
> Hi, Jiaxun,
>
> On Mon, Jul 20, 2020 at 6:20 PM Jiaxun Yang <jiaxun.yang@flygoat.com> wrote:
>>
>>
>> 在 2020/7/20 下午6:01, Huacai Chen 写道:
>>> Hi, Jiaxun,
>>>
>>> On Mon, Jul 20, 2020 at 3:44 PM Jiaxun Yang <jiaxun.yang@flygoat.com> wrote:
>>>> Previously, we're hardcoding resserved ISA I/O Space in code, now
>>>> we're processing reverved I/O via DeviceTree directly. Using the ranges
>>>> property to determine the size and address of reserved I/O space.
>>> Maybe it is better to reserve a default legacy io range if there is no
>>> "isa" node in the .dts file?
>> As currently all dts is built-in in Kernel, I don't think it's necessary.
>>
>> Also the only ISA driver remaining that can't be probed by dts is i8042.
>> We can convert it to DeviceTree based, and then we'll always be safe.
>>
> If you don't reserve a default legacy io range, then I should define
> an "isa" node for KVM guests even if the VM doesn't have i8042 and
> i8259. Because some pci devices still have legacy i/o ports, such as
> qxl. I have tested your patches and found that KVM guests with qxl
> cannot work without an "isa" node.

Oops, I forgot stdvga. piix4_smbus may face the same situation too.

But I'd still think adding a isa node for QEMU virt target can be better.
My universal target is to kill boot_param and reach full-DT boot, thus I
don't
want to introduce such regression.


Thanks
- Jiaxun

>
> Huacai
>> Thanks.
>>
>> - Jiaxun
>>
>>> Huacai
>>>> Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
>>>> ---
>>>> arch/mips/loongson64/init.c | 85 ++++++++++++++++++++++++++-----------
>>>> 1 file changed, 60 insertions(+), 25 deletions(-)
>>>>
>>>> diff --git a/arch/mips/loongson64/init.c b/arch/mips/loongson64/init.c
>>>> index 59ddadace83f..028d7b324ec2 100644
>>>> --- a/arch/mips/loongson64/init.c
>>>> +++ b/arch/mips/loongson64/init.c
>>>> @@ -7,6 +7,8 @@
>>>> #include <linux/irqchip.h>
>>>> #include <linux/logic_pio.h>
>>>> #include <linux/memblock.h>
>>>> +#include <linux/of.h>
>>>> +#include <linux/of_address.h>
>>>> #include <asm/bootinfo.h>
>>>> #include <asm/traps.h>
>>>> #include <asm/smp-ops.h>
>>>> @@ -63,41 +65,74 @@ void __init prom_free_prom_memory(void)
>>>> {
>>>> }
>>>>
>>>> -static __init void reserve_pio_range(void)
>>>> +static int __init add_legacy_isa_io(struct fwnode_handle *fwnode, phys_addr_t addr,
>>>> + resource_size_t size)
>>>> {
>>>> + int ret = 0;
>>>> struct logic_pio_hwaddr *range;
>>>> + unsigned long vaddr;
>>>>
>>>> range = kzalloc(sizeof(*range), GFP_ATOMIC);
>>>> if (!range)
>>>> - return;
>>>> + return -ENOMEM;
>>>>
>>>> - range->fwnode = &of_root->fwnode;
>>>> - range->size = MMIO_LOWER_RESERVED;
>>>> - range->hw_start = LOONGSON_PCIIO_BASE;
>>>> + range->fwnode = fwnode;
>>>> + range->size = size;
>>>> + range->hw_start = addr;
>>>> range->flags = LOGIC_PIO_CPU_MMIO;
>>>>
>>>> - if (logic_pio_register_range(range)) {
>>>> - pr_err("Failed to reserve PIO range for legacy ISA\n");
>>>> - goto free_range;
>>>> + ret = logic_pio_register_range(range);
>>>> + if (ret) {
>>>> + kfree(range);
>>>> + return ret;
>>>> + }
>>>> +
>>>> + /* Legacy ISA must placed at the start of PCI_IOBASE */
>>>> + if (range->io_start != 0) {
>>>> + logic_pio_unregister_range(range);
>>>> + kfree(range);
>>>> + return -EINVAL;
>>>> }
>>>>
>>>> - if (WARN(range->io_start != 0,
>>>> - "Reserved PIO range does not start from 0\n"))
>>>> - goto unregister;
>>>> -
>>>> - /*
>>>> - * i8259 would access I/O space, so mapping must be done here.
>>>> - * Please remove it when all drivers can be managed by logic_pio.
>>>> - */
>>>> - ioremap_page_range(PCI_IOBASE, PCI_IOBASE + MMIO_LOWER_RESERVED,
>>>> - LOONGSON_PCIIO_BASE,
>>>> - pgprot_device(PAGE_KERNEL));
>>>> -
>>>> - return;
>>>> -unregister:
>>>> - logic_pio_unregister_range(range);
>>>> -free_range:
>>>> - kfree(range);
>>>> + vaddr = PCI_IOBASE + range->io_start;
>>>> +
>>>> + ioremap_page_range(vaddr, vaddr + size, addr, pgprot_device(PAGE_KERNEL));
>>>> +
>>>> + return 0;
>>>> +}
>>>> +
>>>> +static __init void reserve_pio_range(void)
>>>> +{
>>>> + struct device_node *np;
>>>> +
>>>> + for_each_node_by_name(np, "isa") {
>>>> + struct of_pci_range range;
>>>> + struct of_pci_range_parser parser;
>>>> +
>>>> + pr_info("ISA Bridge: %pOF\n", np);
>>>> +
>>>> + if (of_pci_range_parser_init(&parser, np)) {
>>>> + pr_info("Failed to parse resources.\n");
>>>> + break;
>>>> + }
>>>> +
>>>> + for_each_of_pci_range(&parser, &range) {
>>>> + switch (range.flags & IORESOURCE_TYPE_BITS) {
>>>> + case IORESOURCE_IO:
>>>> + pr_info(" IO 0x%016llx..0x%016llx\n",
>>>> + range.cpu_addr,
>>>> + range.cpu_addr + range.size - 1);
>>>> + if (add_legacy_isa_io(&np->fwnode, range.cpu_addr, range.size))
>>>> + pr_warn("Failed to reserve legacy IO in Logic PIO\n");
>>>> + break;
>>>> + case IORESOURCE_MEM:
>>>> + pr_info(" MEM 0x%016llx..0x%016llx\n",
>>>> + range.cpu_addr,
>>>> + range.cpu_addr + range.size - 1);
>>>> + break;
>>>> + }
>>>> + }
>>>> + }
>>>> }
>>>>
>>>> void __init arch_init_irq(void)
>>>> --
>>>> 2.28.0.rc1
>>>>

\
 
 \ /
  Last update: 2020-07-20 14:00    [W:2.555 / U:0.048 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site