Re: [PATCH] usb: dwc3: make USB_DWC3_EXYNOS independent

From: Krzysztof Kozlowski
Date: Wed Mar 03 2021 - 13:25:10 EST


On 03/03/2021 15:05, Greg Kroah-Hartman wrote:
On Wed, Mar 03, 2021 at 11:38:39AM +0100, Krzysztof Kozlowski wrote:
This is so far component of a SoC, so it cannot be re-used outside of
SoC. Unless it appears in a new SoC (just like recent re-use of Samsung
serial driver for Apple M1). Because of the architecture, you cannot
build universal kernel without ARCH_EXYNOS. You need it. Otherwise the
kernel won't boot on hardware with DWC Exynos.

So, to create a "generic" arm64 kernel, I need to go enable all of the
ARCH_* variants as well? I thought we were trying to NOT do the same
mess that arm32 had for this type of thing.

The kernel itself is generic and could work on all arm64 platforms. You have to however enable all ARCH_* because of the design choice:
1. device tree sources are toggled with ARCH_xxx
2. the given ARCH_xxx might select specific drivers needed for the kernel to work (or the drivers depend on it).

Maybe except the device trees, the case 2. above could be solved not with dependency but "imply".

Since DWC Exynos won't work without ARCH_EXYNOS - the user will not get
any usable binary - I think all, or almost all, SoC specific drivers are
limited per ARCH. This limits the amount of choices for distro people
and other kernel configuring folks, so they won't have to consider
useless options.

Why do we have ARCH_EXYNOS at all? x86-64 doesn't have this, why is
arm64 somehow special here?

Because x86 is plug and play? Has BIOS? You can have generic kernel? ARM is not like this - you need to load for example proper device tree blob matching your hardware. This could be loaded/passed/chosen by bootloader, but it's not the same as BIOS.

That's my complaint, it feels wrong that I have to go and enable all
different ARCH_ symbols just to build these drivers. If people want
'default' configurations, then provide an exynos default config file,
right?

If you refer to only building, then options are usually compile-testable. But if you think about having a working kernel, why having a ARCH_xxx for given platform feels wrong? Isn't it nice to hide all stuff behind one option?

I think MIPS and RISC-V do similar.


Anyway, that's the convention or consensus so far for entire SoC. If we
want to change it - sure, but let's make it for everyone, not for just
this one USB driver.

Great, let's change it for everyone, I don't see a need for ARCH_*
symbols except for people who want to make it simpler for their one
board type. And for that, use a defconfig.

I've complained about this before, from a driver subsystem maintainer
point of view, this is crazy, drivers should be building and working on
everything. Worst case, it's a cpu-type issue, to build or not build a
driver (i.e. s390, i386), best case it's a feature-type issue to depend
on (i.e. USB, TTY, etc.). But never a "this one sub-architecture of
this one cpu"-type issue. That feels crazy to me...

From the building point of view, I agree that the goal is to build them everywhere. This is why we have COMPILE_TEST. From the running/working point of view, these are not PCI or USB cards. These are dedicated blocks of System on Chip. They sometimes got reused on different SoCs but they do not exist outside the SoC.

Is there a point to split a complex PCI driver into 10 different parts and be able to use each of this part separately? Usually not...

Best regards,
Krzysztof