diff mbox series

[2/2] iommu: arm-smmu-qcom: add sdm670 compatible

Message ID 20220920223955.151507-3-mailingradian@gmail.com
State New
Headers show
Series iommu: SMMU for SDM670 | expand

Commit Message

Richard Acayan Sept. 20, 2022, 10:39 p.m. UTC
The Snapdragon 670 needs the IOMMU for GENI I2C. Add a compatible string to
support it.

Signed-off-by: Richard Acayan <mailingradian@gmail.com>
---
 drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c | 1 +
 1 file changed, 1 insertion(+)

Comments

Konrad Dybcio Sept. 20, 2022, 11:45 p.m. UTC | #1
On 21.09.2022 00:39, Richard Acayan wrote:
> The Snapdragon 670 needs the IOMMU for GENI I2C.
Way more than that, but sure :D

 Add a compatible string to
> support it.
> 
> Signed-off-by: Richard Acayan <mailingradian@gmail.com>
> ---
Reviewed-by: Konrad Dybcio <konrad.dybcio@somainline.org>

Konrad
>  drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
> index b2708de25ea3..bf9653b9eb89 100644
> --- a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
> +++ b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
> @@ -431,6 +431,7 @@ static const struct of_device_id __maybe_unused qcom_smmu_impl_of_match[] = {
>  	{ .compatible = "qcom,sc8180x-smmu-500" },
>  	{ .compatible = "qcom,sc8280xp-smmu-500" },
>  	{ .compatible = "qcom,sdm630-smmu-v2" },
> +	{ .compatible = "qcom,sdm670-smmu-500" },
>  	{ .compatible = "qcom,sdm845-smmu-500" },
>  	{ .compatible = "qcom,sm6125-smmu-500" },
>  	{ .compatible = "qcom,sm6350-smmu-500" },
Konrad Dybcio Sept. 21, 2022, 6:47 p.m. UTC | #2
On 21.09.2022 09:31, Krzysztof Kozlowski wrote:
> On 21/09/2022 00:39, Richard Acayan wrote:
>> The Snapdragon 670 needs the IOMMU for GENI I2C. Add a compatible string to
>> support it.
>>
>> Signed-off-by: Richard Acayan <mailingradian@gmail.com>
>> ---
>>  drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c | 1 +
>>  1 file changed, 1 insertion(+)
>>
>> diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
>> index b2708de25ea3..bf9653b9eb89 100644
>> --- a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
>> +++ b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
>> @@ -431,6 +431,7 @@ static const struct of_device_id __maybe_unused qcom_smmu_impl_of_match[] = {
>>  	{ .compatible = "qcom,sc8180x-smmu-500" },
>>  	{ .compatible = "qcom,sc8280xp-smmu-500" },
>>  	{ .compatible = "qcom,sdm630-smmu-v2" },
>> +	{ .compatible = "qcom,sdm670-smmu-500" },
> 
> Why do we keep adding compatibles to the driver for apparently
> compatible devices?

Because Linux has not funny run on bare Qualcomm hardware ever since at least msm8x60 times and
we are not interacting with real hardware, only with Qualcomm's flawed virtual implementation
of it, that's abstracted to us through various generations of their saddening software stack. This
is also the case for many more standard components, even as far as the GIC on recent boards..

Konrad
> 
> 
> Best regards,
> Krzysztof
Krzysztof Kozlowski Sept. 21, 2022, 7:05 p.m. UTC | #3
On 21/09/2022 20:48, Konrad Dybcio wrote:
> 
> 
> On 21.09.2022 20:47, Konrad Dybcio wrote:
>>
>>
>> On 21.09.2022 09:31, Krzysztof Kozlowski wrote:
>>> On 21/09/2022 00:39, Richard Acayan wrote:
>>>> The Snapdragon 670 needs the IOMMU for GENI I2C. Add a compatible string to
>>>> support it.
>>>>
>>>> Signed-off-by: Richard Acayan <mailingradian@gmail.com>
>>>> ---
>>>>  drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c | 1 +
>>>>  1 file changed, 1 insertion(+)
>>>>
>>>> diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
>>>> index b2708de25ea3..bf9653b9eb89 100644
>>>> --- a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
>>>> +++ b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
>>>> @@ -431,6 +431,7 @@ static const struct of_device_id __maybe_unused qcom_smmu_impl_of_match[] = {
>>>>  	{ .compatible = "qcom,sc8180x-smmu-500" },
>>>>  	{ .compatible = "qcom,sc8280xp-smmu-500" },
>>>>  	{ .compatible = "qcom,sdm630-smmu-v2" },
>>>> +	{ .compatible = "qcom,sdm670-smmu-500" },
>>>
>>> Why do we keep adding compatibles to the driver for apparently
>>> compatible devices?
>>
>> Because Linux has not funny run on bare Qualcomm hardware ever since at least msm8x60 times and
> s/funny/fully
> 
> unfortunate typo, this is not funny, quite the contrary..
> 
> Konrad
>> we are not interacting with real hardware, only with Qualcomm's flawed virtual implementation
>> of it, that's abstracted to us through various generations of their saddening software stack. This
>> is also the case for many more standard components, even as far as the GIC on recent boards..

Unfortunately I don't get this explanation... you mean some other
firmware requires Linux drivers to use specific compatibles instead of
one fallback?

All of these do not have driver data, so they are essentially compatible
for Linux driver. Growing this list in the driver seems pointless. What
is the benefit of growing driver with same entries, except more patches?

Best regards,
Krzysztof
Konrad Dybcio Sept. 21, 2022, 9:14 p.m. UTC | #4
On 21.09.2022 21:05, Krzysztof Kozlowski wrote:
> On 21/09/2022 20:48, Konrad Dybcio wrote:
>>
>>
>> On 21.09.2022 20:47, Konrad Dybcio wrote:
>>>
>>>
>>> On 21.09.2022 09:31, Krzysztof Kozlowski wrote:
>>>> On 21/09/2022 00:39, Richard Acayan wrote:
>>>>> The Snapdragon 670 needs the IOMMU for GENI I2C. Add a compatible string to
>>>>> support it.
>>>>>
>>>>> Signed-off-by: Richard Acayan <mailingradian@gmail.com>
>>>>> ---
>>>>>  drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c | 1 +
>>>>>  1 file changed, 1 insertion(+)
>>>>>
>>>>> diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
>>>>> index b2708de25ea3..bf9653b9eb89 100644
>>>>> --- a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
>>>>> +++ b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
>>>>> @@ -431,6 +431,7 @@ static const struct of_device_id __maybe_unused qcom_smmu_impl_of_match[] = {
>>>>>  	{ .compatible = "qcom,sc8180x-smmu-500" },
>>>>>  	{ .compatible = "qcom,sc8280xp-smmu-500" },
>>>>>  	{ .compatible = "qcom,sdm630-smmu-v2" },
>>>>> +	{ .compatible = "qcom,sdm670-smmu-500" },
>>>>
>>>> Why do we keep adding compatibles to the driver for apparently
>>>> compatible devices?
>>>
>>> Because Linux has not funny run on bare Qualcomm hardware ever since at least msm8x60 times and
>> s/funny/fully
>>
>> unfortunate typo, this is not funny, quite the contrary..
>>
>> Konrad
>>> we are not interacting with real hardware, only with Qualcomm's flawed virtual implementation
>>> of it, that's abstracted to us through various generations of their saddening software stack. This
>>> is also the case for many more standard components, even as far as the GIC on recent boards..
> 
> Unfortunately I don't get this explanation... you mean some other
> firmware requires Linux drivers to use specific compatibles instead of
> one fallback?
No, perhaps I misunderstood you.

> 
> All of these do not have driver data, so they are essentially compatible
> for Linux driver. Growing this list in the driver seems pointless. What
> is the benefit of growing driver with same entries, except more patches?
Compatible lists in smmu-impl files allow matching driver quirks for SMMUs themselves
and consumer devices (such as MDSS). The situation is more complicated, because some
qcom SMMUs also require more quirks than others (think 8974 vs 8994 vs 8996/pro&660&8998
vs 845+ vs adreno smmu in various flavours), so all qcom SMMUs need to use
`qcom_smmu_impl` and some others need even more quirks on top of that (that generally
hurt performance or functionality, so we don't want them when they're unnecessary).
If all generations of qcom SMMU implementation that bear the same name behaved anywhere
near consistent, there would be no need for keeping this around, instead requiring only
"qcom,broken-smmu" or something".

Konrad
> 
> Best regards,
> Krzysztof
>
Richard Acayan Sept. 22, 2022, 2:38 a.m. UTC | #5
>On 21.09.2022 21:05, Krzysztof Kozlowski wrote:
>> On 21/09/2022 20:48, Konrad Dybcio wrote:
>>>
>>>
>>> On 21.09.2022 20:47, Konrad Dybcio wrote:
>>>>
>>>>
>>>> On 21.09.2022 09:31, Krzysztof Kozlowski wrote:
>>>>> On 21/09/2022 00:39, Richard Acayan wrote:
>>>>>> The Snapdragon 670 needs the IOMMU for GENI I2C. Add a compatible string to
>>>>>> support it.
>>>>>>
>>>>>> Signed-off-by: Richard Acayan <mailingradian@gmail.com>
>>>>>> ---
>>>>>>  drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c | 1 +
>>>>>>  1 file changed, 1 insertion(+)
>>>>>>
>>>>>> diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
>>>>>> index b2708de25ea3..bf9653b9eb89 100644
>>>>>> --- a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
>>>>>> +++ b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
>>>>>> @@ -431,6 +431,7 @@ static const struct of_device_id __maybe_unused qcom_smmu_impl_of_match[] = {
>>>>>>  	{ .compatible = "qcom,sc8180x-smmu-500" },
>>>>>>  	{ .compatible = "qcom,sc8280xp-smmu-500" },
>>>>>>  	{ .compatible = "qcom,sdm630-smmu-v2" },
>>>>>> +	{ .compatible = "qcom,sdm670-smmu-500" },
>>>>>
>>>>> Why do we keep adding compatibles to the driver for apparently
>>>>> compatible devices?
>>>>
>>>> Because Linux has not funny run on bare Qualcomm hardware ever since at least msm8x60 times and
>>> s/funny/fully
>>>
>>> unfortunate typo, this is not funny, quite the contrary..
>>>
>>> Konrad
>>>> we are not interacting with real hardware, only with Qualcomm's flawed virtual implementation
>>>> of it, that's abstracted to us through various generations of their saddening software stack. This
>>>> is also the case for many more standard components, even as far as the GIC on recent boards..
>> 
>> Unfortunately I don't get this explanation... you mean some other
>> firmware requires Linux drivers to use specific compatibles instead of
>> one fallback?
> No, perhaps I misunderstood you.
>
>> 
>> All of these do not have driver data, so they are essentially compatible
>> for Linux driver. Growing this list in the driver seems pointless. What
>> is the benefit of growing driver with same entries, except more patches?
> Compatible lists in smmu-impl files allow matching driver quirks for SMMUs themselves
>and consumer devices (such as MDSS). The situation is more complicated, because some
>qcom SMMUs also require more quirks than others (think 8974 vs 8994 vs 8996/pro&660&8998
>vs 845+ vs adreno smmu in various flavours), so all qcom SMMUs need to use
> `qcom_smmu_impl` and some others need even more quirks on top of that (that generally
>hurt performance or functionality, so we don't want them when they're unnecessary).
> If all generations of qcom SMMU implementation that bear the same name behaved anywhere
>near consistent, there would be no need for keeping this around, instead requiring only
> "qcom,broken-smmu" or something".

Hi, just stopping by to share my own thoughts.

First, I don't mind if this series doesn't get applied as-is. After seeing
the eMMC driver in its current state:

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/mmc/host/sdhci-msm.c?h=v6.0-rc6#n2437

I can understand that the devicetree maintainers don't want to see new SoCs
touching drivers unnecessarily. Second, I don't see enough quirks to
justify needing all compatible strings in the driver (2 quirky SoCs
compared to 16 total not counting adreno iommu):

    $ grep qcom, drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
    	if (of_device_is_compatible(np, "qcom,msm8996-smmu-v2"))
    	* All targets that use the qcom,adreno-smmu compatible string *should*
    	{ .compatible = "qcom,adreno" },
    	{ .compatible = "qcom,mdp4" },
    	{ .compatible = "qcom,mdss" },
    	{ .compatible = "qcom,sc7180-mdss" },
    	{ .compatible = "qcom,sc7180-mss-pil" },
    	{ .compatible = "qcom,sc7280-mdss" },
    	{ .compatible = "qcom,sc7280-mss-pil" },
    	{ .compatible = "qcom,sc8180x-mdss" },
    	{ .compatible = "qcom,sm8250-mdss" },
    	{ .compatible = "qcom,sdm845-mdss" },
    	{ .compatible = "qcom,sdm845-mss-pil" },
    	if (of_device_is_compatible(np, "qcom,sdm845-smmu-500"))
    	{ .compatible = "qcom,msm8998-smmu-v2" },
    	{ .compatible = "qcom,qcm2290-smmu-500" },
    	{ .compatible = "qcom,sc7180-smmu-500" },
    	{ .compatible = "qcom,sc7280-smmu-500" },
    	{ .compatible = "qcom,sc8180x-smmu-500" },
    	{ .compatible = "qcom,sc8280xp-smmu-500" },
    	{ .compatible = "qcom,sdm630-smmu-v2" },
    	{ .compatible = "qcom,sdm670-smmu-500" },
    	{ .compatible = "qcom,sdm845-smmu-500" },
    	{ .compatible = "qcom,sm6125-smmu-500" },
    	{ .compatible = "qcom,sm6350-smmu-500" },
    	{ .compatible = "qcom,sm6375-smmu-500" },
    	{ .compatible = "qcom,sm8150-smmu-500" },
    	{ .compatible = "qcom,sm8250-smmu-500" },
    	{ .compatible = "qcom,sm8350-smmu-500" },
    	{ .compatible = "qcom,sm8450-smmu-500" },
    	if (of_device_is_compatible(np, "qcom,adreno-smmu"))

I don't know if it's better to get myself involved in fixing this, though.
There is no fallback that encompasses qcom devices but not all arm devices.
Either way, I'll have to add a new compatible string to the driver.

If something like this is fine for now, I'll format it properly tomorrow:

--- a/Documentation/devicetree/bindings/iommu/arm,smmu.yaml
+++ b/Documentation/devicetree/bindings/iommu/arm,smmu.yaml
@@ -48,6 +48,13 @@ properties:
               - qcom,sm8350-smmu-500
               - qcom,sm8450-smmu-500
           - const: arm,mmu-500
+
+      - description: Qcom SoCs implementing "qcom,smmu-500"
+        items:
+          - enum:
+              - qcom,sdm670-smmu-500
+          - const: qcom,smmu-500
+
       - description: Qcom Adreno GPUs implementing "arm,smmu-v2"
         items:
           - enum:
--- a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
+++ b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
@@ -424,6 +424,7 @@ static struct arm_smmu_device *qcom_smmu_create(struct arm_smmu_device *smmu,
 }
 
 static const struct of_device_id __maybe_unused qcom_smmu_impl_of_match[] = {
+       { .compatible = "qcom,smmu-500" },
        { .compatible = "qcom,msm8998-smmu-v2" },
        { .compatible = "qcom,qcm2290-smmu-500" },
        { .compatible = "qcom,sc7180-smmu-500" },

>
> Konrad
>> 
>> Best regards,
>> Krzysztof
>>
Krzysztof Kozlowski Sept. 22, 2022, 6:39 a.m. UTC | #6
On 21/09/2022 23:14, Konrad Dybcio wrote:
>> Unfortunately I don't get this explanation... you mean some other
>> firmware requires Linux drivers to use specific compatibles instead of
>> one fallback?
> No, perhaps I misunderstood you.
> 
>>
>> All of these do not have driver data, so they are essentially compatible
>> for Linux driver. Growing this list in the driver seems pointless. What
>> is the benefit of growing driver with same entries, except more patches?
> Compatible lists in smmu-impl files allow matching driver quirks for SMMUs themselves
> and consumer devices (such as MDSS). The situation is more complicated, because some
> qcom SMMUs also require more quirks than others (think 8974 vs 8994 vs 8996/pro&660&8998
> vs 845+ vs adreno smmu in various flavours), so all qcom SMMUs need to use
> `qcom_smmu_impl` and some others need even more quirks on top of that (that generally
> hurt performance or functionality, so we don't want them when they're unnecessary).
> If all generations of qcom SMMU implementation that bear the same name behaved anywhere
> near consistent, there would be no need for keeping this around, instead requiring only
> "qcom,broken-smmu" or something".

So where are the quirks? Again: driver data is empty.

Best regards,
Krzysztof
Richard Acayan Sept. 23, 2022, 10:24 p.m. UTC | #7
> On 22/09/2022 12:48, Konrad Dybcio wrote:
>> 
>> 
>> On 22.09.2022 08:41, Krzysztof Kozlowski wrote:
>>> On 22/09/2022 04:38, Richard Acayan wrote:
>>>>> On 21.09.2022 21:05, Krzysztof Kozlowski wrote:
>>>>>> On 21/09/2022 20:48, Konrad Dybcio wrote:
>>>>>>>
>>>>>>>
>>>>>>> On 21.09.2022 20:47, Konrad Dybcio wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>> On 21.09.2022 09:31, Krzysztof Kozlowski wrote:
>>>>>>>>> On 21/09/2022 00:39, Richard Acayan wrote:
>>>>>>>>>> The Snapdragon 670 needs the IOMMU for GENI I2C. Add a compatible string to
>>>>>>>>>> support it.
>>>>>>>>>>
>>>>>>>>>> Signed-off-by: Richard Acayan <mailingradian@gmail.com>
>>>>>>>>>> ---
>>>>>>>>>>  drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c | 1 +
>>>>>>>>>>  1 file changed, 1 insertion(+)
>>>>>>>>>>
>>>>>>>>>> diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
>>>>>>>>>> index b2708de25ea3..bf9653b9eb89 100644
>>>>>>>>>> --- a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
>>>>>>>>>> +++ b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
>>>>>>>>>> @@ -431,6 +431,7 @@ static const struct of_device_id __maybe_unused qcom_smmu_impl_of_match[] = {
>>>>>>>>>>  	{ .compatible = "qcom,sc8180x-smmu-500" },
>>>>>>>>>>  	{ .compatible = "qcom,sc8280xp-smmu-500" },
>>>>>>>>>>  	{ .compatible = "qcom,sdm630-smmu-v2" },
>>>>>>>>>> +	{ .compatible = "qcom,sdm670-smmu-500" },
>>>>>>>>>
>>>>>>>>> Why do we keep adding compatibles to the driver for apparently
>>>>>>>>> compatible devices?
>>>>>>>>
>>>>>>>> Because Linux has not funny run on bare Qualcomm hardware ever since at least msm8x60 times and
>>>>>>> s/funny/fully
>>>>>>>
>>>>>>> unfortunate typo, this is not funny, quite the contrary..
>>>>>>>
>>>>>>> Konrad
>>>>>>>> we are not interacting with real hardware, only with Qualcomm's flawed virtual implementation
>>>>>>>> of it, that's abstracted to us through various generations of their saddening software stack. This
>>>>>>>> is also the case for many more standard components, even as far as the GIC on recent boards..
>>>>>>
>>>>>> Unfortunately I don't get this explanation... you mean some other
>>>>>> firmware requires Linux drivers to use specific compatibles instead of
>>>>>> one fallback?
>>>>> No, perhaps I misunderstood you.
>>>>>
>>>>>>
>>>>>> All of these do not have driver data, so they are essentially compatible
>>>>>> for Linux driver. Growing this list in the driver seems pointless. What
>>>>>> is the benefit of growing driver with same entries, except more patches?
>>>>> Compatible lists in smmu-impl files allow matching driver quirks for SMMUs themselves
>>>>> and consumer devices (such as MDSS). The situation is more complicated, because some
>>>>> qcom SMMUs also require more quirks than others (think 8974 vs 8994 vs 8996/pro&660&8998
>>>>> vs 845+ vs adreno smmu in various flavours), so all qcom SMMUs need to use
>>>>> `qcom_smmu_impl` and some others need even more quirks on top of that (that generally
>>>>> hurt performance or functionality, so we don't want them when they're unnecessary).
>>>>> If all generations of qcom SMMU implementation that bear the same name behaved anywhere
>>>>> near consistent, there would be no need for keeping this around, instead requiring only
>>>>> "qcom,broken-smmu" or something".
>>>>
>>>> Hi, just stopping by to share my own thoughts.
>>>>
>>>> First, I don't mind if this series doesn't get applied as-is. After seeing
>>>> the eMMC driver in its current state:
>>>>
>>>> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/mmc/host/sdhci-msm.c?h=v6.0-rc6#n2437
>>>>
>>>> I can understand that the devicetree maintainers don't want to see new SoCs
>>>> touching drivers unnecessarily. Second, I don't see enough quirks to
>>>> justify needing all compatible strings in the driver (2 quirky SoCs
>>>> compared to 16 total not counting adreno iommu):
>>>>
>>>>     $ grep qcom, drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
>>>>     	if (of_device_is_compatible(np, "qcom,msm8996-smmu-v2"))
>>>>     	* All targets that use the qcom,adreno-smmu compatible string *should*
>>>>     	{ .compatible = "qcom,adreno" },
>>>>     	{ .compatible = "qcom,mdp4" },
>>>>     	{ .compatible = "qcom,mdss" },
>>>>     	{ .compatible = "qcom,sc7180-mdss" },
>>>>     	{ .compatible = "qcom,sc7180-mss-pil" },
>>>>     	{ .compatible = "qcom,sc7280-mdss" },
>>>>     	{ .compatible = "qcom,sc7280-mss-pil" },
>>>>     	{ .compatible = "qcom,sc8180x-mdss" },
>>>>     	{ .compatible = "qcom,sm8250-mdss" },
>>>>     	{ .compatible = "qcom,sdm845-mdss" },
>>>>     	{ .compatible = "qcom,sdm845-mss-pil" },
>>>>     	if (of_device_is_compatible(np, "qcom,sdm845-smmu-500"))
>>>>     	{ .compatible = "qcom,msm8998-smmu-v2" },
>>>>     	{ .compatible = "qcom,qcm2290-smmu-500" },
>>>>     	{ .compatible = "qcom,sc7180-smmu-500" },
>>>>     	{ .compatible = "qcom,sc7280-smmu-500" },
>>>>     	{ .compatible = "qcom,sc8180x-smmu-500" },
>>>>     	{ .compatible = "qcom,sc8280xp-smmu-500" },
>>>>     	{ .compatible = "qcom,sdm630-smmu-v2" },
>>>>     	{ .compatible = "qcom,sdm670-smmu-500" },
>>>>     	{ .compatible = "qcom,sdm845-smmu-500" },
>>>>     	{ .compatible = "qcom,sm6125-smmu-500" },
>>>>     	{ .compatible = "qcom,sm6350-smmu-500" },
>>>>     	{ .compatible = "qcom,sm6375-smmu-500" },
>>>>     	{ .compatible = "qcom,sm8150-smmu-500" },
>>>>     	{ .compatible = "qcom,sm8250-smmu-500" },
>>>>     	{ .compatible = "qcom,sm8350-smmu-500" },
>>>>     	{ .compatible = "qcom,sm8450-smmu-500" },
>>>>     	if (of_device_is_compatible(np, "qcom,adreno-smmu"))
>>>>
>>>> I don't know if it's better to get myself involved in fixing this, though.
>>>> There is no fallback that encompasses qcom devices but not all arm devices.
>>>> Either way, I'll have to add a new compatible string to the driver.
>>>>
>>>> If something like this is fine for now, I'll format it properly tomorrow:
>>>
>>> Please wait till we reach some conclusion otherwise your work might be
>>> wasted.
>>>
>>>>
>>>> --- a/Documentation/devicetree/bindings/iommu/arm,smmu.yaml
>>>> +++ b/Documentation/devicetree/bindings/iommu/arm,smmu.yaml
>>>> @@ -48,6 +48,13 @@ properties:
>>>>                - qcom,sm8350-smmu-500
>>>>                - qcom,sm8450-smmu-500
>>>>            - const: arm,mmu-500
>>>> +
>>>> +      - description: Qcom SoCs implementing "qcom,smmu-500"
>>>> +        items:
>>>> +          - enum:
>>>> +              - qcom,sdm670-smmu-500
>>>> +          - const: qcom,smmu-500
>>>> +
>>>
>>> Someone would have to confirm that smmu-500 is a real device
>>> spec/version. Otherwise this should be device-specific compatible (e.g.
>>> earliest in family).
>> In my view it's hard to name it, downstream uses bool properties for enabling/disabling
>> certain quirks and on different generations there are different combinations of that.
>> Interestingly enough, I vaguely remember that the same quirk names can mean different
>> things on different msm-X.Y versions.. Add to that, different msm-X.Y versions can have
>> different assumptions on what's the default (aka without taking the bool properties into
>> account) behaviour for a given compatible. 
>
> Downstream does not care about ABI, coding style, reasonable approach,
> so it should not wonder that they code things inconsistent.
>
>
>> So I suppose "first in the family" would be
>> the best way to go for mainline, though there are still quite a few families:
>> 
>> <earlier ones used qcom_iommu>
>> - 8996 with quirks that are already accounted for (or one may also say it works by miracle,
>> just like msm8916 - downstream adds more special handling, but looks like the fw is not as
>> restrictive)
>> 
>> - 8996pro + 660 + 8998 with serious unmerged ones [1]
>> 
>> - 845 which seems to be aok
>> 
>> - special case of chromebooks where they only have qcom TZ/XPUs and not the hypervisor to
>> fight with, so ma-a-aybe (no downstream reference & I don't have the hw to confirm) they
>> can get away with less things
>> 
>> - 8[1234]50 which seem to be a mix-and-match of less serious (read: not accounting for them
>> may hurt performance but will not make your device sepuku at SMMU probe) minor quirks
>> [2][3][4][5] (big warning: these may be overriden somewhere in other device tree fragments,
>> the surest option would be to take a compiled dtb and decompile it to be sure about it)
>> 
>> - 4xxx/6xxx series that mostly align with "whatever was there on the flagship soc released
>> a year before"
>
> If the devices are really different, even though it is not visible in
> Linux driver, then indeed there is no point for fake compatibility. I
> raised the question only because the driver does not customize the
> variants, but that might be not enough.

If there are no problems with the original patch, could you please indicate
that? I think this thread is getting a little lengthy for the other
maintainers.

> Linked DTSI use different quirks (assuming quirks would have same
> meaning...), plus they have sometimes different amount of clocks, so in
> total maybe it is not reasonable to make them compatible. On the other
> hand, maybe the programming model is very, very similar thus Linux could
> bind to one fallback and few different bits would be customized with
> specific compatible.

Not to rush you or anything. If you think this should be decided before the
series goes in, it's not urgent.
Dmitry Baryshkov Oct. 18, 2022, 10:21 a.m. UTC | #8
On 22/09/2022 00:14, Konrad Dybcio wrote:
> 
> 
> On 21.09.2022 21:05, Krzysztof Kozlowski wrote:
>> On 21/09/2022 20:48, Konrad Dybcio wrote:
>>>
>>>
>>> On 21.09.2022 20:47, Konrad Dybcio wrote:
>>>>
>>>>
>>>> On 21.09.2022 09:31, Krzysztof Kozlowski wrote:
>>>>> On 21/09/2022 00:39, Richard Acayan wrote:
>>>>>> The Snapdragon 670 needs the IOMMU for GENI I2C. Add a compatible string to
>>>>>> support it.
>>>>>>
>>>>>> Signed-off-by: Richard Acayan <mailingradian@gmail.com>
>>>>>> ---
>>>>>>   drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c | 1 +
>>>>>>   1 file changed, 1 insertion(+)
>>>>>>
>>>>>> diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
>>>>>> index b2708de25ea3..bf9653b9eb89 100644
>>>>>> --- a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
>>>>>> +++ b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
>>>>>> @@ -431,6 +431,7 @@ static const struct of_device_id __maybe_unused qcom_smmu_impl_of_match[] = {
>>>>>>   	{ .compatible = "qcom,sc8180x-smmu-500" },
>>>>>>   	{ .compatible = "qcom,sc8280xp-smmu-500" },
>>>>>>   	{ .compatible = "qcom,sdm630-smmu-v2" },
>>>>>> +	{ .compatible = "qcom,sdm670-smmu-500" },
>>>>>
>>>>> Why do we keep adding compatibles to the driver for apparently
>>>>> compatible devices?
>>>>
>>>> Because Linux has not funny run on bare Qualcomm hardware ever since at least msm8x60 times and
>>> s/funny/fully
>>>
>>> unfortunate typo, this is not funny, quite the contrary..
>>>
>>> Konrad
>>>> we are not interacting with real hardware, only with Qualcomm's flawed virtual implementation
>>>> of it, that's abstracted to us through various generations of their saddening software stack. This
>>>> is also the case for many more standard components, even as far as the GIC on recent boards..
>>
>> Unfortunately I don't get this explanation... you mean some other
>> firmware requires Linux drivers to use specific compatibles instead of
>> one fallback?
> No, perhaps I misunderstood you.
> 
>>
>> All of these do not have driver data, so they are essentially compatible
>> for Linux driver. Growing this list in the driver seems pointless. What
>> is the benefit of growing driver with same entries, except more patches?
> Compatible lists in smmu-impl files allow matching driver quirks for SMMUs themselves
> and consumer devices (such as MDSS). The situation is more complicated, because some
> qcom SMMUs also require more quirks than others (think 8974 vs 8994 vs 8996/pro&660&8998
> vs 845+ vs adreno smmu in various flavours), so all qcom SMMUs need to use
> `qcom_smmu_impl` and some others need even more quirks on top of that (that generally
> hurt performance or functionality, so we don't want them when they're unnecessary).
> If all generations of qcom SMMU implementation that bear the same name behaved anywhere
> near consistent, there would be no need for keeping this around, instead requiring only
> "qcom,broken-smmu" or something".

Excuse me for bumping this thread, I successfully forgot this message in 
drafts folder.

Granted the driver, your pending smmu patches and the current list of 
quirks (which includes qcom,msm8996-smmu-v2 and qcom,sdm845-smmu-500, 
and Konrad's unmerged quirks for -v2), I'd second the suggestion of 
adding a single qcom,msm-smmu-500 (or qcom,arm-smmu-500) entry as a 
generic fallback. Downstream device trees support this name by using the 
-v500 suffix (yes, it's a light argument, but still). This way we can 
apply SoC-specific quirks, while still retaining the generic entry here.

What's definitely has to be done is the merge of the platform data from 
arm-smmu-qcom-debug.c into arm-smmu-qcom.c. And having identical entries 
there just drives me crazy. I'll work on a patch later today.

For -v2 we already have the generic compat, however granted the lack of 
proper quirks in place, I'd abstain from reworking this part for now.

BTW: I'm trying to follow the commit a242f4297cfe ("iommu/arm-smmu-qcom: 
Skip the TTBR1 quirk for db820c."). It adds msm8996-specific quirk, but 
we lack the msm8996 compat entry in the array. Does this work at all?

> 
> Konrad
>>
>> Best regards,
>> Krzysztof
>>
diff mbox series

Patch

diff --git a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
index b2708de25ea3..bf9653b9eb89 100644
--- a/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
+++ b/drivers/iommu/arm/arm-smmu/arm-smmu-qcom.c
@@ -431,6 +431,7 @@  static const struct of_device_id __maybe_unused qcom_smmu_impl_of_match[] = {
 	{ .compatible = "qcom,sc8180x-smmu-500" },
 	{ .compatible = "qcom,sc8280xp-smmu-500" },
 	{ .compatible = "qcom,sdm630-smmu-v2" },
+	{ .compatible = "qcom,sdm670-smmu-500" },
 	{ .compatible = "qcom,sdm845-smmu-500" },
 	{ .compatible = "qcom,sm6125-smmu-500" },
 	{ .compatible = "qcom,sm6350-smmu-500" },