On Thu, Mar 19, 2026 at 07:20:26AM +0800, kernel test robot wrote:
[...]

Bjorn,

Some sparse error are even seen without my change, should we fix them ?

-Mukesh
> 
> sparse warnings: (new ones prefixed by >>)
>    drivers/remoteproc/qcom_q6v5_pas.c:141:25: sparse: sparse: incorrect type 
> in assignment (different address spaces) @@     expected void *mem_region @@  
>    got void [noderef] __iomem * @@
>    drivers/remoteproc/qcom_q6v5_pas.c:141:25: sparse:     expected void 
> *mem_region
>    drivers/remoteproc/qcom_q6v5_pas.c:141:25: sparse:     got void [noderef] 
> __iomem *
>    drivers/remoteproc/qcom_q6v5_pas.c:148:45: sparse: sparse: incorrect type 
> in argument 2 (different address spaces) @@     expected void const volatile 
> [noderef] __iomem *src @@     got void * @@
>    drivers/remoteproc/qcom_q6v5_pas.c:148:45: sparse:     expected void const 
> volatile [noderef] __iomem *src
>    drivers/remoteproc/qcom_q6v5_pas.c:148:45: sparse:     got void *
>    drivers/remoteproc/qcom_q6v5_pas.c:250:37: sparse: sparse: incorrect type 
> in assignment (different address spaces) @@     expected void *dtb_mem_region 
> @@     got void [noderef] __iomem * @@
>    drivers/remoteproc/qcom_q6v5_pas.c:250:37: sparse:     expected void 
> *dtb_mem_region
>    drivers/remoteproc/qcom_q6v5_pas.c:250:37: sparse:     got void [noderef] 
> __iomem *
> >> drivers/remoteproc/qcom_q6v5_pas.c:260:28: sparse: sparse: incorrect type 
> >> in argument 1 (different address spaces) @@     expected void volatile 
> >> [noderef] __iomem *addr @@     got void *dtb_mem_region @@
>    drivers/remoteproc/qcom_q6v5_pas.c:260:28: sparse:     expected void 
> volatile [noderef] __iomem *addr
>    drivers/remoteproc/qcom_q6v5_pas.c:260:28: sparse:     got void 
> *dtb_mem_region
>    drivers/remoteproc/qcom_q6v5_pas.c:344:33: sparse: sparse: incorrect type 
> in assignment (different address spaces) @@     expected void *mem_region @@  
>    got void [noderef] __iomem * @@
>    drivers/remoteproc/qcom_q6v5_pas.c:344:33: sparse:     expected void 
> *mem_region
>    drivers/remoteproc/qcom_q6v5_pas.c:344:33: sparse:     got void [noderef] 
> __iomem *
> >> drivers/remoteproc/qcom_q6v5_pas.c:354:20: sparse: sparse: incorrect type 
> >> in argument 1 (different address spaces) @@     expected void volatile 
> >> [noderef] __iomem *addr @@     got void *mem_region @@
>    drivers/remoteproc/qcom_q6v5_pas.c:354:20: sparse:     expected void 
> volatile [noderef] __iomem *addr
>    drivers/remoteproc/qcom_q6v5_pas.c:354:20: sparse:     got void *mem_region
>    drivers/remoteproc/qcom_q6v5_pas.c:481:25: sparse: sparse: incorrect type 
> in assignment (different address spaces) @@     expected void *mem_region @@  
>    got void [noderef] __iomem * @@
>    drivers/remoteproc/qcom_q6v5_pas.c:481:25: sparse:     expected void 
> *mem_region
>    drivers/remoteproc/qcom_q6v5_pas.c:481:25: sparse:     got void [noderef] 
> __iomem *
> 
> vim +260 drivers/remoteproc/qcom_q6v5_pas.c
> 
>    124        
>    125        static void qcom_pas_segment_dump(struct rproc *rproc,
>    126                                          struct rproc_dump_segment 
> *segment,
>    127                                          void *dest, size_t offset, 
> size_t size)
>    128        {
>    129                struct qcom_pas *pas = rproc->priv;
>    130                int total_offset;
>    131        
>    132                total_offset = segment->da + segment->offset + offset - 
> pas->mem_phys;
>    133                if (total_offset < 0 || total_offset + size > 
> pas->mem_size) {
>    134                        dev_err(pas->dev,
>    135                                "invalid copy request for segment %pad 
> with offset %zu and size %zu)\n",
>    136                                &segment->da, offset, size);
>    137                        memset(dest, 0xff, size);
>    138                        return;
>    139                }
>    140        
>  > 141                pas->mem_region = ioremap_wc(pas->mem_phys, 
> pas->mem_size);
>    142                if (!pas->mem_region) {
>    143                        dev_err(pas->dev, "unable to map memory region: 
> %pa+%zx\n",
>    144                                &pas->mem_phys, pas->mem_size);
>    145                        return;
>    146                }
>    147        
>    148                memcpy_fromio(dest, pas->mem_region + total_offset, 
> size);
>    149        }
>    150        
>    151        static void qcom_pas_minidump(struct rproc *rproc)
>    152        {
>    153                struct qcom_pas *pas = rproc->priv;
>    154        
>    155                if (rproc->dump_conf == RPROC_COREDUMP_DISABLED)
>    156                        return;
>    157        
>    158                qcom_minidump(rproc, pas->minidump_id, 
> qcom_pas_segment_dump);
>    159        }
>    160        
>    161        static int qcom_pas_pds_enable(struct qcom_pas *pas, struct 
> device **pds,
>    162                                       size_t pd_count)
>    163        {
>    164                int ret;
>    165                int i;
>    166        
>    167                for (i = 0; i < pd_count; i++) {
>    168                        dev_pm_genpd_set_performance_state(pds[i], 
> INT_MAX);
>    169                        ret = pm_runtime_get_sync(pds[i]);
>    170                        if (ret < 0) {
>    171                                pm_runtime_put_noidle(pds[i]);
>    172                                
> dev_pm_genpd_set_performance_state(pds[i], 0);
>    173                                goto unroll_pd_votes;
>    174                        }
>    175                }
>    176        
>    177                return 0;
>    178        
>    179        unroll_pd_votes:
>    180                for (i--; i >= 0; i--) {
>    181                        dev_pm_genpd_set_performance_state(pds[i], 0);
>    182                        pm_runtime_put(pds[i]);
>    183                }
>    184        
>    185                return ret;
>    186        };
>    187        
>    188        static void qcom_pas_pds_disable(struct qcom_pas *pas, struct 
> device **pds,
>    189                                         size_t pd_count)
>    190        {
>    191                int i;
>    192        
>    193                for (i = 0; i < pd_count; i++) {
>    194                        dev_pm_genpd_set_performance_state(pds[i], 0);
>    195                        pm_runtime_put(pds[i]);
>    196                }
>    197        }
>    198        
>    199        static int qcom_pas_shutdown_poll_decrypt(struct qcom_pas *pas)
>    200        {
>    201                unsigned int retry_num = 50;
>    202                int ret;
>    203        
>    204                do {
>    205                        msleep(QCOM_PAS_DECRYPT_SHUTDOWN_DELAY_MS);
>    206                        ret = qcom_scm_pas_shutdown(pas->pas_id);
>    207                } while (ret == -EINVAL && --retry_num);
>    208        
>    209                return ret;
>    210        }
>    211        
>    212        static int qcom_pas_unprepare(struct rproc *rproc)
>    213        {
>    214                struct qcom_pas *pas = rproc->priv;
>    215        
>    216                /*
>    217                 * qcom_pas_load() did pass pas_metadata to the SCM 
> driver for storing
>    218                 * metadata context. It might have been released 
> already if
>    219                 * auth_and_reset() was successful, but in other cases 
> clean it up
>    220                 * here.
>    221                 */
>    222                qcom_scm_pas_metadata_release(pas->pas_ctx);
>    223                if (pas->dtb_pas_id)
>    224                        qcom_scm_pas_metadata_release(pas->dtb_pas_ctx);
>    225        
>    226                return 0;
>    227        }
>    228        
>    229        static int qcom_pas_load(struct rproc *rproc, const struct 
> firmware *fw)
>    230        {
>    231                struct qcom_pas *pas = rproc->priv;
>    232                int ret;
>    233        
>    234                /* Store firmware handle to be used in qcom_pas_start() 
> */
>    235                pas->firmware = fw;
>    236        
>    237                if (pas->lite_pas_id)
>    238                        qcom_scm_pas_shutdown(pas->lite_pas_id);
>    239                if (pas->lite_dtb_pas_id)
>    240                        qcom_scm_pas_shutdown(pas->lite_dtb_pas_id);
>    241        
>    242                if (pas->dtb_pas_id) {
>    243                        ret = request_firmware(&pas->dtb_firmware, 
> pas->dtb_firmware_name, pas->dev);
>    244                        if (ret) {
>    245                                dev_err(pas->dev, "request_firmware 
> failed for %s: %d\n",
>    246                                        pas->dtb_firmware_name, ret);
>    247                                return ret;
>    248                        }
>    249        
>  > 250                        pas->dtb_mem_region = 
> ioremap_wc(pas->dtb_mem_phys, pas->dtb_mem_size);
>    251                        if (!pas->dtb_mem_region) {
>    252                                dev_err(pas->dev, "unable to map dtb 
> memory region: %pa+%zx\n",
>    253                                        &pas->dtb_mem_phys, 
> pas->dtb_mem_size);
>    254                                goto release_dtb_metadata;
>    255                        }
>    256        
>    257                        ret = qcom_mdt_pas_load(pas->dtb_pas_ctx, 
> pas->dtb_firmware,
>    258                                                pas->dtb_firmware_name, 
> pas->dtb_mem_region,
>    259                                                &pas->dtb_mem_reloc);
>  > 260                        iounmap(pas->dtb_mem_region);
>    261                        pas->dtb_mem_region = NULL;
>    262                        if (ret)
>    263                                goto release_dtb_metadata;
>    264                }
>    265        
>    266                return 0;
>    267        
>    268        release_dtb_metadata:
>    269                if (pas->dtb_pas_id)
>    270                        qcom_scm_pas_metadata_release(pas->dtb_pas_ctx);
>    271        
>    272                release_firmware(pas->dtb_firmware);
>    273        
>    274                return ret;
>    275        }
>    276        
>    277        static void qcom_pas_unmap_carveout(struct rproc *rproc, 
> phys_addr_t mem_phys, size_t size)
>    278        {
>    279                if (rproc->has_iommu)
>    280                        iommu_unmap(rproc->domain, mem_phys, size);
>    281        }
>    282        
>    283        static int qcom_pas_map_carveout(struct rproc *rproc, 
> phys_addr_t mem_phys, size_t size)
>    284        {
>    285                int ret = 0;
>    286        
>    287                if (rproc->has_iommu)
>    288                        ret = iommu_map(rproc->domain, mem_phys, 
> mem_phys, size,
>    289                                        IOMMU_READ | IOMMU_WRITE, 
> GFP_KERNEL);
>    290                return ret;
>    291        }
>    292        
>    293        static int qcom_pas_start(struct rproc *rproc)
>    294        {
>    295                struct qcom_pas *pas = rproc->priv;
>    296                int ret;
>    297        
>    298                ret = qcom_q6v5_prepare(&pas->q6v5);
>    299                if (ret)
>    300                        return ret;
>    301        
>    302                ret = qcom_pas_pds_enable(pas, pas->proxy_pds, 
> pas->proxy_pd_count);
>    303                if (ret < 0)
>    304                        goto disable_irqs;
>    305        
>    306                ret = clk_prepare_enable(pas->xo);
>    307                if (ret)
>    308                        goto disable_proxy_pds;
>    309        
>    310                ret = clk_prepare_enable(pas->aggre2_clk);
>    311                if (ret)
>    312                        goto disable_xo_clk;
>    313        
>    314                if (pas->cx_supply) {
>    315                        ret = regulator_enable(pas->cx_supply);
>    316                        if (ret)
>    317                                goto disable_aggre2_clk;
>    318                }
>    319        
>    320                if (pas->px_supply) {
>    321                        ret = regulator_enable(pas->px_supply);
>    322                        if (ret)
>    323                                goto disable_cx_supply;
>    324                }
>    325        
>    326                if (pas->dtb_pas_id) {
>    327                        ret = qcom_pas_map_carveout(rproc, 
> pas->dtb_mem_phys, pas->dtb_mem_size);
>    328                        if (ret)
>    329                                goto disable_px_supply;
>    330        
>    331                        ret = 
> qcom_scm_pas_prepare_and_auth_reset(pas->dtb_pas_ctx);
>    332                        if (ret) {
>    333                                dev_err(pas->dev,
>    334                                        "failed to authenticate dtb 
> image and release reset\n");
>    335                                goto unmap_dtb_carveout;
>    336                        }
>    337                }
>    338        
>    339                /*
>    340                 * During subsystem restart, when coredump is enabled, 
> region is mapped but
>    341                 * not unmapped there, NULL check to reuse the mapping 
> if its already mapped.
>    342                 */
>    343                if (!pas->mem_region) {
>    344                        pas->mem_region = ioremap_wc(pas->mem_phys, 
> pas->mem_size);
>    345                        if (!pas->mem_region) {
>    346                                dev_err(pas->dev, "unable to map memory 
> region: %pa+%zx\n",
>    347                                        &pas->mem_phys, pas->mem_size);
>    348                                goto release_pas_metadata;
>    349                        }
>    350                }
>    351        
>    352                ret = qcom_mdt_pas_load(pas->pas_ctx, pas->firmware, 
> rproc->firmware,
>    353                                        pas->mem_region, 
> &pas->mem_reloc);
>  > 354                iounmap(pas->mem_region);
>    355                pas->mem_region = NULL;
>    356                if (ret)
>    357                        goto release_pas_metadata;
>    358        
>    359                qcom_pil_info_store(pas->info_name, pas->mem_phys, 
> pas->mem_size);
>    360        
>    361                ret = qcom_pas_map_carveout(rproc, pas->mem_phys, 
> pas->mem_size);
>    362                if (ret)
>    363                        goto release_pas_metadata;
>    364        
>    365                ret = qcom_scm_pas_prepare_and_auth_reset(pas->pas_ctx);
>    366                if (ret) {
>    367                        dev_err(pas->dev,
>    368                                "failed to authenticate image and 
> release reset\n");
>    369                        goto unmap_carveout;
>    370                }
>    371        
>    372                ret = qcom_q6v5_wait_for_start(&pas->q6v5, 
> msecs_to_jiffies(5000));
>    373                if (ret == -ETIMEDOUT) {
>    374                        dev_err(pas->dev, "start timed out\n");
>    375                        qcom_scm_pas_shutdown(pas->pas_id);
>    376                        goto unmap_carveout;
>    377                }
>    378        
>    379                qcom_scm_pas_metadata_release(pas->pas_ctx);
>    380                if (pas->dtb_pas_id)
>    381                        qcom_scm_pas_metadata_release(pas->dtb_pas_ctx);
>    382        
>    383                /* firmware is used to pass reference from 
> qcom_pas_start(), drop it now */
>    384                pas->firmware = NULL;
>    385        
>    386                return 0;
>    387        
>    388        unmap_carveout:
>    389                qcom_pas_unmap_carveout(rproc, pas->mem_phys, 
> pas->mem_size);
>    390        release_pas_metadata:
>    391                qcom_scm_pas_metadata_release(pas->pas_ctx);
>    392                if (pas->dtb_pas_id)
>    393                        qcom_scm_pas_metadata_release(pas->dtb_pas_ctx);
>    394        
>    395        unmap_dtb_carveout:
>    396                if (pas->dtb_pas_id)
>    397                        qcom_pas_unmap_carveout(rproc, 
> pas->dtb_mem_phys, pas->dtb_mem_size);
>    398        disable_px_supply:
>    399                if (pas->px_supply)
>    400                        regulator_disable(pas->px_supply);
>    401        disable_cx_supply:
>    402                if (pas->cx_supply)
>    403                        regulator_disable(pas->cx_supply);
>    404        disable_aggre2_clk:
>    405                clk_disable_unprepare(pas->aggre2_clk);
>    406        disable_xo_clk:
>    407                clk_disable_unprepare(pas->xo);
>    408        disable_proxy_pds:
>    409                qcom_pas_pds_disable(pas, pas->proxy_pds, 
> pas->proxy_pd_count);
>    410        disable_irqs:
>    411                qcom_q6v5_unprepare(&pas->q6v5);
>    412        
>    413                /* firmware is used to pass reference from 
> qcom_pas_start(), drop it now */
>    414                pas->firmware = NULL;
>    415        
>    416                return ret;
>    417        }
>    418        
> 
> -- 
> 0-DAY CI Kernel Test Service
> https://github.com/intel/lkp-tests/wiki

-- 
-Mukesh Ojha

Reply via email to