]> git.hungrycats.org Git - linux/commitdiff
BackMerge tag 'v7.2' into drm-next
authorDave Airlie <airlied@redhat.com>
Thu, 20 Aug 2026 00:58:44 +0000 (10:58 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 20 Aug 2026 00:58:44 +0000 (10:58 +1000)
Linux 7.2

There was a lot of conflicts this round between fixes and next,
and I'd like to get the merge resolutions that we have in drm-tip.

Signed-off-by: Dave Airlie <airlied@redhat.com>
58 files changed:
1  2 
.mailmap
Documentation/admin-guide/cgroup-v2.rst
MAINTAINERS
drivers/accel/amdxdna/amdxdna_gem.c
drivers/accel/ethosu/ethosu_job.c
drivers/accel/rocket/rocket_job.c
drivers/dma-buf/udmabuf.c
drivers/gpu/buddy.c
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_job.c
drivers/gpu/drm/amd/amdgpu/amdgpu_job.h
drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c
drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c
drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu15/smu_v15_0_0_ppt.c
drivers/gpu/drm/bridge/analogix/analogix_dp_core.c
drivers/gpu/drm/bridge/display-connector.c
drivers/gpu/drm/bridge/parade-ps8640.c
drivers/gpu/drm/clients/drm_log.c
drivers/gpu/drm/display/drm_hdmi_state_helper.c
drivers/gpu/drm/drm_fb_helper.c
drivers/gpu/drm/drm_gem_shmem_helper.c
drivers/gpu/drm/drm_gpusvm.c
drivers/gpu/drm/imagination/pvr_queue.c
drivers/gpu/drm/mediatek/mtk_dsi.c
drivers/gpu/drm/mediatek/mtk_hdmi_v2.c
drivers/gpu/drm/panel/Kconfig
drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
drivers/gpu/drm/panthor/panthor_fw.c
drivers/gpu/drm/panthor/panthor_gem.c
drivers/gpu/drm/panthor/panthor_mmu.c
drivers/gpu/drm/panthor/panthor_sched.c
drivers/gpu/drm/scheduler/sched_entity.c
drivers/gpu/drm/scheduler/sched_main.c
drivers/gpu/drm/ttm/ttm_pool.c
drivers/gpu/drm/v3d/v3d_drv.h
drivers/gpu/drm/v3d/v3d_gem.c
drivers/gpu/drm/v3d/v3d_power.c
drivers/gpu/drm/v3d/v3d_sched.c
drivers/gpu/drm/v3d/v3d_submit.c
drivers/gpu/drm/virtio/virtgpu_kms.c
drivers/gpu/drm/virtio/virtgpu_vq.c
drivers/gpu/drm/xe/xe_bo.h
drivers/gpu/drm/xe/xe_exec_queue.c
drivers/gpu/drm/xe/xe_execlist.c
drivers/gpu/drm/xe/xe_guc_ads.c
drivers/gpu/drm/xe/xe_lrc.c
drivers/gpu/drm/xe/xe_oa.c
drivers/gpu/drm/xe/xe_pxp.c
drivers/gpu/host1x/bus.c
include/drm/gpu_scheduler.h
kernel/events/core.c
rust/helpers/io.c
rust/kernel/devres.rs
rust/kernel/io.rs

diff --cc .mailmap
Simple merge
diff --cc MAINTAINERS
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 35faea0ff17ffbc70ec84447f27c38051fa8165e,42be8ee155dde010e6043f01806993ccc07fb28e..b15af318784b509e50d8989d6a9f25cfa6f2fe9e
@@@ -467,20 -466,16 +467,20 @@@ int amdgpu_xcp_open_device(struct amdgp
  void amdgpu_xcp_release_sched(struct amdgpu_device *adev,
                                  struct amdgpu_ctx_entity *entity)
  {
-       struct drm_gpu_scheduler *sched =
-               container_of(entity->entity.rq, typeof(*sched), rq);
 +      struct amdgpu_xcp_mgr *xcp_mgr = adev->xcp_mgr;
+       struct drm_gpu_scheduler *sched;
 -      struct amdgpu_ring *ring;
  
 -      if (!adev->xcp_mgr)
 +      if (!xcp_mgr)
                return;
  
+       sched = entity->entity.rq->sched;
        if (drm_sched_wqueue_ready(sched)) {
 -              ring = to_amdgpu_ring(entity->entity.rq->sched);
 -              atomic_dec(&adev->xcp_mgr->xcp[ring->xcp_id].ref_cnt);
 +              struct amdgpu_ring *ring = to_amdgpu_ring(sched);
 +
 +              mutex_lock(&xcp_mgr->xcp_lock);
 +              if (ring->xcp_id < xcp_mgr->num_xcps && xcp_mgr->xcp[ring->xcp_id].valid)
 +                      atomic_dec(&xcp_mgr->xcp[ring->xcp_id].ref_cnt);
 +              mutex_unlock(&xcp_mgr->xcp_lock);
        }
  }
  
index 1054c4b4b03e1a6eee64a5269afca5d1bf47de61,bd054cbfbae08447f77e6b832a0b21237e537d4c..56a5c11bc196140015dccd172c09655e850d0050
@@@ -1613,69 -1610,58 +1613,69 @@@ static int smu_v14_0_2_get_fan_speed_rp
                                                speed);
  }
  
 -static int smu_v14_0_2_get_power_limit(struct smu_context *smu,
 -                                     uint32_t *current_power_limit,
 -                                     uint32_t *default_power_limit,
 -                                     uint32_t *max_power_limit,
 -                                     uint32_t *min_power_limit)
 +static int smu_v14_0_2_get_ppt_limit(struct smu_context *smu,
 +                                   enum smu_ppt_limit_type limit_type,
 +                                   uint32_t *ppt_limit)
  {
 -      struct smu_table_context *table_context = &smu->smu_table;
 -      struct smu_14_0_2_powerplay_table *powerplay_table =
 -              table_context->power_play_table;
 -      PPTable_t *pptable = table_context->driver_pptable;
 -      CustomSkuTable_t *skutable = &pptable->CustomSkuTable;
 -      uint32_t pp_limit = smu->adev->pm.ac_power ?
 -              skutable->SocketPowerLimitAc[PPT_THROTTLER_PPT0] :
 -              skutable->SocketPowerLimitDc[PPT_THROTTLER_PPT0];
 -      uint32_t msg_limit = pptable->SkuTable.MsgLimits.Power[PPT_THROTTLER_PPT0][POWER_SOURCE_AC];
 -      uint32_t min_limit = min_t(uint32_t, pp_limit, msg_limit);
 -      uint32_t max_limit = max_t(uint32_t, pp_limit, msg_limit);
 -      int16_t od_percent_upper = 0, od_percent_lower = 0;
 +      OverDriveTableExternal_t od_table;
        int ret;
  
 -      if (current_power_limit) {
 -              ret = smu_v14_0_get_current_power_limit(smu, current_power_limit);
 -              if (ret)
 -                      *current_power_limit = pp_limit;
 -      }
 +      if (limit_type != SMU_PPT_LIMIT_PPT0)
 +              return -EOPNOTSUPP;
  
 -      if (default_power_limit)
 -              *default_power_limit = pp_limit;
 -
 -      if (powerplay_table) {
 -              if (smu->od_enabled &&
 -                  smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_PPT_BIT)) {
 -                      od_percent_upper = pptable->SkuTable.OverDriveLimitsBasicMax.Ppt;
 -                      od_percent_lower = pptable->SkuTable.OverDriveLimitsBasicMin.Ppt;
 -              } else if (smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_PPT_BIT)) {
 -                      od_percent_upper = 0;
 -                      od_percent_lower = pptable->SkuTable.OverDriveLimitsBasicMin.Ppt;
 -              }
 -      }
 +      ret = smu_v14_0_get_ppt_limit(smu, limit_type, ppt_limit);
 +      if (ret)
 +              return ret;
  
 -      dev_dbg(smu->adev->dev, "od percent upper:%d, od percent lower:%d (default power: %d)\n",
 -                                      od_percent_upper, od_percent_lower, pp_limit);
 +      ret = smu_v14_0_2_get_overdrive_table(smu, &od_table);
 +      if (ret)
 +              return ret;
  
 -      if (max_power_limit) {
 -              *max_power_limit = max_limit * (100 + od_percent_upper);
 -              *max_power_limit /= 100;
 -      }
 +      if (od_table.OverDriveTable.Ppt > 0)
 +              *ppt_limit = *ppt_limit *
 +                      (100 + od_table.OverDriveTable.Ppt) / 100;
  
 -      if (min_power_limit) {
 -              *min_power_limit = min_limit * (100 + od_percent_lower);
 -              *min_power_limit /= 100;
 -      }
 +      return 0;
 +}
 +
 +static int smu_v14_0_2_init_ppt_limits(struct smu_context *smu)
 +{
 +      struct smu_table_context *table_context = &smu->smu_table;
 +      struct smu_14_0_2_powerplay_table *powerplay_table =
 +              table_context->power_play_table;
 +      PPTable_t *pptable = table_context->driver_pptable;
 +      CustomSkuTable_t *skutable = &pptable->CustomSkuTable;
 +      int16_t od_percent_upper = 0, od_percent_lower = 0;
-       uint32_t pp_limit, msg_limit, min_limit, max_limit;
-       int i;
-       if (powerplay_table &&
-           smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_PPT_BIT)) {
-               od_percent_upper = pptable->SkuTable.OverDriveLimitsBasicMax.Ppt;
-               od_percent_lower = pptable->SkuTable.OverDriveLimitsBasicMin.Ppt;
-       }
-       for (i = SMU_POWER_SOURCE_AC; i < SMU_POWER_SOURCE_COUNT; i++) {
-               pp_limit = i == SMU_POWER_SOURCE_AC ?
-                       skutable->SocketPowerLimitAc[PPT_THROTTLER_PPT0] :
-                       skutable->SocketPowerLimitDc[PPT_THROTTLER_PPT0];
-               msg_limit = pptable->SkuTable.MsgLimits.Power
-                       [PPT_THROTTLER_PPT0][i];
-               min_limit = min(pp_limit, msg_limit);
-               max_limit = max(pp_limit, msg_limit);
-               smu->ppt_limits.range[i][SMU_PPT_LIMIT_PPT0].default_value =
-                       pp_limit;
-               smu->ppt_limits.range[i][SMU_PPT_LIMIT_PPT0].max = max_limit;
-               smu->ppt_limits.range[i][SMU_PPT_LIMIT_PPT0].min =
-                       min_limit * (100 + od_percent_lower) / 100;
-               smu->ppt_limits.range[i][SMU_PPT_LIMIT_PPT0].od_max =
-                       max_limit * (100 + od_percent_upper) / 100;
-               smu->ppt_limits.range[i][SMU_PPT_LIMIT_PPT0].od_min =
-                       smu->ppt_limits.range[i][SMU_PPT_LIMIT_PPT0].min;
-       }
-       smu->ppt_limits.supported_mask |= BIT(SMU_PPT_LIMIT_PPT0);
++        uint32_t pp_limit, msg_limit, min_limit, max_limit;
++        int i;
++
++        if (powerplay_table && 
++            smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_PPT_BIT)) {
++                od_percent_upper = pptable->SkuTable.OverDriveLimitsBasicMax.Ppt;
++                od_percent_lower = pptable->SkuTable.OverDriveLimitsBasicMin.Ppt;
++        }
++
++        for (i = SMU_POWER_SOURCE_AC; i < SMU_POWER_SOURCE_COUNT; i++) {
++                pp_limit = i == SMU_POWER_SOURCE_AC ?
++                        skutable->SocketPowerLimitAc[PPT_THROTTLER_PPT0] :
++                        skutable->SocketPowerLimitDc[PPT_THROTTLER_PPT0];
++                msg_limit = pptable->SkuTable.MsgLimits.Power
++                        [PPT_THROTTLER_PPT0][i];
++                min_limit = min(pp_limit, msg_limit);
++                max_limit = max(pp_limit, msg_limit);
++
++                smu->ppt_limits.range[i][SMU_PPT_LIMIT_PPT0].default_value =
++                        pp_limit;
++                smu->ppt_limits.range[i][SMU_PPT_LIMIT_PPT0].max = max_limit;
++                smu->ppt_limits.range[i][SMU_PPT_LIMIT_PPT0].min =
++                        min_limit * (100 + od_percent_lower) / 100;
++                smu->ppt_limits.range[i][SMU_PPT_LIMIT_PPT0].od_max =
++                        max_limit * (100 + od_percent_upper) / 100;
++                smu->ppt_limits.range[i][SMU_PPT_LIMIT_PPT0].od_min =
++                        smu->ppt_limits.range[i][SMU_PPT_LIMIT_PPT0].min;
++        }
++
++        smu->ppt_limits.supported_mask |= BIT(SMU_PPT_LIMIT_PPT0);
  
        return 0;
  }
index 12fe2bc0488e79df4969256aa5f1f1bc64cfa493,0da1ffb3a567856d329de7611022099d4288917c..cbfeb9736e6c405c7ae338b5a952096be8b0d0ce
@@@ -510,29 -334,109 +510,29 @@@ static int smu_v15_0_0_get_smu_metrics_
                                            uint32_t *value)
  {
        struct smu_table_context *smu_table = &smu->smu_table;
 +      SMU_15_0_0_MetricsInfo_t *metrics_info =
 +              (SMU_15_0_0_MetricsInfo_t *)smu_table->metrics_table;
 +      int ret;
  
 -      SmuMetrics_t *metrics = (SmuMetrics_t *)smu_table->metrics_table;
 -      int ret = 0;
 +      if (member >= ARRAY_SIZE(metrics_info->avg_metric))
 +              return -EINVAL;
  
 -      ret = smu_v15_0_0_get_metrics_table(smu, NULL, false);
 -      if (ret)
 +      ret = smu_v15_0_0_get_metrics_table(smu, metrics_info);
 +      if (ret < 0)
                return ret;
  
-       if (ret == 0 &&
-           metrics_info->metrics[metrics_info->active_idx].IOD.AccumulationCounter !=
-           metrics_info->metrics[!metrics_info->active_idx].IOD.AccumulationCounter) {
-               /* New sample: active_idx already points to the latest sample. */
-               smu_v15_0_0_compute_all_metrics(metrics_info->avg_metric,
-                                               &metrics_info->metrics[!metrics_info->active_idx],
-                                               &metrics_info->metrics[metrics_info->active_idx]);
 -      switch (member) {
 -      case METRICS_AVERAGE_GFXCLK:
 -              *value = metrics->GfxclkFrequency;
 -              break;
 -      case METRICS_AVERAGE_SOCCLK:
 -              *value = metrics->SocclkFrequency;
 -              break;
 -      case METRICS_AVERAGE_VCLK:
 -              *value = metrics->VclkFrequency;
 -              break;
 -      case METRICS_AVERAGE_DCLK:
 -              *value = 0;
 -              break;
 -      case METRICS_AVERAGE_UCLK:
 -              *value = metrics->MemclkFrequency;
 -              break;
 -      case METRICS_AVERAGE_FCLK:
 -              *value = metrics->FclkFrequency;
 -              break;
 -      case METRICS_AVERAGE_VPECLK:
 -              *value = metrics->VpeclkFrequency;
 -              break;
 -      case METRICS_AVERAGE_NPUCLK:
 -              *value = metrics->NpuclkFrequency;
 -              break;
 -      case METRICS_AVERAGE_GFXACTIVITY:
 -              if ((smu->smc_fw_version > 0x5d4600))
 -                      *value = metrics->GfxActivity;
 -              else
 -                      *value = metrics->GfxActivity / 100;
 -              break;
 -      case METRICS_AVERAGE_VCNACTIVITY:
 -              *value = metrics->VcnActivity / 100;
 -              break;
 -      case METRICS_AVERAGE_SOCKETPOWER:
 -      case METRICS_CURR_SOCKETPOWER:
 -              *value = metrics->SocketPower;
 -              break;
 -      case METRICS_TEMPERATURE_EDGE:
 -              *value = metrics->GfxTemperature / 100 *
 -              SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
 -              break;
 -      case METRICS_TEMPERATURE_HOTSPOT:
 -              *value = metrics->SocTemperature / 100 *
 -              SMU_TEMPERATURE_UNITS_PER_CENTIGRADES;
 -              break;
 -      case METRICS_THROTTLER_RESIDENCY_PROCHOT:
 -              *value = metrics->ThrottleResidency_PROCHOT;
 -              break;
 -      case METRICS_THROTTLER_RESIDENCY_SPL:
 -              *value = metrics->ThrottleResidency_SPL;
 -              break;
 -      case METRICS_THROTTLER_RESIDENCY_FPPT:
 -              *value = metrics->ThrottleResidency_FPPT;
 -              break;
 -      case METRICS_THROTTLER_RESIDENCY_SPPT:
 -              *value = metrics->ThrottleResidency_SPPT;
 -              break;
 -      case METRICS_THROTTLER_RESIDENCY_THM_SOC:
 -              *value = metrics->ThrottleResidency_THM_SOC;
 -              break;
 -      case METRICS_VOLTAGE_VDDGFX:
 -              *value = 0;
 -              break;
 -      case METRICS_VOLTAGE_VDDSOC:
 -              *value = 0;
 -              break;
 -      case METRICS_SS_APU_SHARE:
 -              /* return the percentage of APU power with respect to APU's power limit.
 -               * percentage is reported, this isn't boost value. Smartshift power
 -               * boost/shift is only when the percentage is more than 100.
 -               */
 -              if (metrics->StapmOpnLimit > 0)
 -                      *value = (metrics->ApuPower * 100) / metrics->StapmOpnLimit;
 -              else
 -                      *value = 0;
 -              break;
 -      case METRICS_SS_DGPU_SHARE:
 -              /* return the percentage of dGPU power with respect to dGPU's power limit.
 -               * percentage is reported, this isn't boost value. Smartshift power
 -               * boost/shift is only when the percentage is more than 100.
 -               */
 -              if ((metrics->dGpuPower > 0) &&
 -                  (metrics->StapmCurrentLimit > metrics->StapmOpnLimit))
 -                      *value = (metrics->dGpuPower * 100) /
 -                               (metrics->StapmCurrentLimit - metrics->StapmOpnLimit);
 -              else
 -                      *value = 0;
 -              break;
 -      default:
 -              *value = UINT_MAX;
 -              break;
--      }
++        if (ret == 0 &&
++            metrics_info->metrics[metrics_info->active_idx].IOD.AccumulationCounter !=
++            metrics_info->metrics[!metrics_info->active_idx].IOD.AccumulationCounter) {
++                /* New sample: active_idx already points to the latest sample. */
++                smu_v15_0_0_compute_all_metrics(metrics_info->avg_metric,
++                                                &metrics_info->metrics[!metrics_info->active_idx],
++                                                &metrics_info->metrics[metrics_info->active_idx]);
++        }
  
 -      return ret;
 +      *value = metrics_info->avg_metric[member];
 +
 +      return 0;
  }
  
  static int smu_v15_0_0_read_sensor(struct smu_context *smu,
index d1e74dd2e05185c003e98d366c81d2fb4d56da2a,6b128fabe3a97be5b916b0d3d04f8f87ee0ff929..eb3412ec30a07eeefb2bf0f28d554c1f31ad1f98
@@@ -208,9 -184,8 +215,10 @@@ static u32 *display_connector_get_input
  
  static const struct drm_bridge_funcs display_connector_bridge_funcs = {
        .attach = display_connector_attach,
+       .destroy = display_connector_destroy,
        .detect = display_connector_bridge_detect,
 +      .hpd_enable = display_connector_hpd_enable,
 +      .hpd_disable = display_connector_hpd_disable,
        .edid_read = display_connector_edid_read,
        .atomic_get_output_bus_fmts = display_connector_get_output_bus_fmts,
        .atomic_get_input_bus_fmts = display_connector_get_input_bus_fmts,
Simple merge
Simple merge
Simple merge
index 09993e858df8b1431e0027b7314ba0729d2745f8,2d52ee321367a9d8ebe9a5b50e137256b5a395dc..24a8645aa9130b57a1c9adfda24c5542c102169d
@@@ -1282,9 -1285,10 +1285,10 @@@ struct pvr_queue *pvr_queue_create(stru
        const struct drm_sched_init_args sched_args = {
                .ops = &pvr_queue_sched_ops,
                .submit_wq = pvr_dev->sched_wq,
+               .num_rqs = 1,
                .credit_limit = 64 * 1024,
                .hang_limit = 1,
 -              .timeout = msecs_to_jiffies(500),
 +              .timeout = msecs_to_jiffies(SCHED_TIMEOUT_PERIOD),
                .timeout_wq = pvr_dev->sched_wq,
                .name = "pvr-queue",
                .dev = pvr_dev->base.dev,
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index c51101ec70c165651131b8a1a64db5fcb8093ea9,672b5c57ed8e9a2e14279adf014f7c7eb7f3f918..a4a7efdbf229686df8af1bd353f2b0707340b86c
@@@ -330,6 -361,10 +357,7 @@@ long drm_sched_entity_flush(struct drm_
        struct task_struct *last_user;
        long ret = timeout;
  
 -      if (!entity->rq)
 -              return 0;
 -
+       sched = entity->rq->sched;
        /*
         * The client will not queue more jobs during this fini - consume
         * existing queued ones, or discard them on SIGKILL.
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 623df9d5bbee66b633f26f5011e21b600b9c1c3a,7682b24f13ec51db7364242ebef22c6d88125f78..834d52030979dddc84a6ce183abbe544e7ae86ae
@@@ -713,8 -495,12 +713,10 @@@ v3d_get_cpu_indirect_csd_params(struct 
               sizeof(indirect_csd.wg_uniform_offsets));
  
        info->indirect = drm_gem_object_lookup(file_priv, indirect_csd.indirect);
+       if (!info->indirect)
+               return -ENOENT;
  
 -      return v3d_setup_csd_jobs_and_bos(file_priv, v3d, &indirect_csd.submit,
 -                                        &info->job, &info->clean_job,
 -                                        NULL, &info->acquire_ctx);
 +      return 0;
  }
  
  /* Get data for the query timestamp job submission. */
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
index 7ed9a4f77f1b569149e737c39ac5d128fd7dc9d5,1edbc274951cbf45993f911edc13e2554f80ddc0..308950aae19c73fcf58e3251a84a35834a57ef5c
@@@ -18,20 -19,8 +19,21 @@@ __rust_helper void rust_helper_iounmap(
  {
        iounmap(addr);
  }
+ #endif /* CONFIG_HAS_IOMEM */
  
 +__rust_helper void rust_helper_memcpy_fromio(void *dst,
 +                                           const volatile void __iomem *src,
 +                                           size_t count)
 +{
 +      memcpy_fromio(dst, src, count);
 +}
 +
 +__rust_helper void rust_helper_memcpy_toio(volatile void __iomem *dst,
 +                                         const void *src, size_t count)
 +{
 +      memcpy_toio(dst, src, count);
 +}
 +
  __rust_helper u8 rust_helper_readb(const void __iomem *addr)
  {
        return readb(addr);
Simple merge
index 95f46bb75f9e87464f95ad3bc2019531ecfb0767,d4063ee4120002977c8af769038ae2bdc868c956..b2b8e64b7aeeadbf1f6ac9b8fb2dab40b9d52cd9
@@@ -4,20 -4,12 +4,21 @@@
  //!
  //! C header: [`include/asm-generic/io.h`](srctree/include/asm-generic/io.h)
  
 +use core::{
 +    marker::PhantomData,
 +    mem::MaybeUninit, //
 +};
 +
  use crate::{
      bindings,
 -    prelude::*, //
 +    prelude::*,
 +    ptr::{
 +        Alignment,
 +        KnownSize, //
 +    }, //
  };
  
+ #[cfg(CONFIG_HAS_IOMEM)]
  pub mod mem;
  pub mod poll;
  pub mod register;