pmem

//pmem device
static struct android_pmem_platform_data android_pmem_kernel_ebi1_pdata = {
       .name = PMEM_KERNEL_EBI1_DATA_NAME,
    /* if no allocator_type, defaults to PMEM_ALLOCATORTYPE_BITMAP,                                                    
    * the only valid choice at this time. The board structure is                                                       
    * set to all zeros by the C runtime initialization and that is now                                                 
    * the enum value of PMEM_ALLOCATORTYPE_BITMAP, now forced to 0 in                                                  
    * include/linux/android_pmem.h.                                                                                    
    */
       .cached = 0,
};
static struct android_pmem_platform_data android_pmem_adsp_pdata = {
       .name = "pmem_adsp",
       .allocator_type = PMEM_ALLOCATORTYPE_BITMAP,
       .cached = 0,
};

static struct android_pmem_platform_data android_pmem_audio_pdata = {
       .name = "pmem_audio",
       .allocator_type = PMEM_ALLOCATORTYPE_BITMAP,
       .cached = 0,
};

static struct platform_device android_pmem_kernel_ebi1_device = {
       .name = "android_pmem",
       .id = 1,
       .dev = { .platform_data = &android_pmem_kernel_ebi1_pdata },
};

static struct platform_device android_pmem_adsp_device = {
       .name = "android_pmem",
       .id = 2,
       .dev = { .platform_data = &android_pmem_adsp_pdata },
};

static struct platform_device android_pmem_audio_device = {
       .name = "android_pmem",
       .id = 4,
       .dev = { .platform_data = &android_pmem_audio_pdata },
};

static struct platform_device *devices[] __initdata = {
    ...
    &android_pmem_kernel_ebi1_device,
    &android_pmem_adsp_device,
    &android_pmem_audio_device,
    ...
}

static void __init msm7x30_init(void)
{
    ...
    platform_add_devices(devices, ARRAY_SIZE(devices));
    ...
}

MACHINE_START(MSM7X30_FLUID, "QCT MSM7X30 FLUID")
#ifdef CONFIG_MSM_DEBUG_UART
    .phys_io  = MSM_DEBUG_UART_PHYS,
    .io_pg_offst = ((MSM_DEBUG_UART_BASE) >> 18) & 0xfffc,
#endif
    .boot_params = PHYS_OFFSET + 0x100,
    .map_io = msm7x30_map_io,
    .init_irq = msm7x30_init_irq,
    .init_machine = msm7x30_init,       //machin
    .timer = &msm_timer,
MACHINE_END


static void (*init_machine)(void) __initdata;

static int __init customize_machine(void)
{
    /* customizes platform devices, or adds new ones */
=>  if (init_machine)
        init_machine();                                             //init_machine() was called during arch init procedure
    return 0;
}
arch_initcall(customize_machine);

*** arch/arm/kernel/setup.c:
customize_machine[811]         if (init_machine)
customize_machine[812]         init_machine();
setup_arch[879]                init_machine = mdesc->init_machine;   //init_machine was initialized here in setup_arch()


------------------------------------
static void __init msm7x30_allocate_memory_regions(void)
{
    void *addr;
    unsigned long size;
/*                                                                                                                     
   Request allocation of Hardware accessible PMEM regions                                                              
   at the beginning to make sure they are allocated in EBI-0.                                                          
   This will allow 7x30 with two mem banks enter the second                                                            
   mem bank into Self-Refresh State during Idle Power Collapse.                                                        
                                                                                                                       
    The current HW accessible PMEM regions are                                                                         
    1. Frame Buffer.                                                                                                   
       LCDC HW can access msm_fb_resources during Idle-PC.                                                             
                                                                                                                       
    2. Audio                                                                                                           
       LPA HW can access android_pmem_audio_pdata during Idle-PC.                                                      
*/
    size = fb_size ? : MSM_FB_SIZE;
    addr = alloc_bootmem(size);
    msm_fb_resources[0].start = __pa(addr);
    msm_fb_resources[0].end = msm_fb_resources[0].start + size - 1;
    pr_info("allocating %lu bytes at %p (%lx physical) for fb\n",
        size, addr, __pa(addr));


    size = pmem_audio_size;
    if (size) {
        addr = alloc_bootmem(size);
        android_pmem_audio_pdata.start = __pa(addr);
        android_pmem_audio_pdata.size = size;
        pr_info("allocating %lu bytes at %p (%lx physical) for audio "
            "pmem arena\n", size, addr, __pa(addr));
    }

    size = gpu_phys_size;
    if (size) {
        addr = alloc_bootmem(size);
        kgsl_resources[1].start = __pa(addr);
        kgsl_resources[1].end = kgsl_resources[1].start + size - 1;
        pr_info("allocating %lu bytes at %p (%lx physical) for "
            "KGSL\n", size, addr, __pa(addr));
    }


    size = pmem_kernel_ebi1_size;
    if (size) {
        addr = alloc_bootmem_aligned(size, 0x100000);
        android_pmem_kernel_ebi1_pdata.start = __pa(addr);
        android_pmem_kernel_ebi1_pdata.size = size;
        pr_info("allocating %lu bytes at %p (%lx physical) for kernel"
            " ebi1 pmem arena\n", size, addr, __pa(addr));
    }


    size = pmem_sf_size;
    if (size) {
        addr = alloc_bootmem(size);
        android_pmem_pdata.start = __pa(addr);
        android_pmem_pdata.size = size;
        pr_info("allocating %lu bytes at %p (%lx physical) for sf "
            "pmem arena\n", size, addr, __pa(addr));
    }


    if machine_is_msm7x30_fluid()
        size = fluid_pmem_adsp_size;
    else
        size = pmem_adsp_size;
    if (size) {
        addr = alloc_bootmem(size);
        android_pmem_adsp_pdata.start = __pa(addr);
        android_pmem_adsp_pdata.size = size;
        pr_info("allocating %lu bytes at %p (%lx physical) for adsp "
            "pmem arena\n", size, addr, __pa(addr));
    }
}


//pmem driver

static struct platform_driver pmem_driver = {
    .probe = pmem_probe,
    .remove = pmem_remove,
    .driver = { .name = "android_pmem",
            .pm = &pmem_dev_pm_ops,
  }
};

static int __init pmem_init(void)
{
    /* create /sys/kernel/<PMEM_SYSFS_DIR_NAME> directory */
    pmem_kset = kset_create_and_add(PMEM_SYSFS_DIR_NAME,
        NULL, kernel_kobj);
    if (!pmem_kset) {
        pr_err("pmem(%s):kset_create_and_add fail\n", __func__);
        return -ENOMEM;
    }


#ifdef CONFIG_MEMORY_HOTPLUG
    hotplug_memory_notifier(pmem_memory_callback, 0);
#endif
    return platform_driver_register(&pmem_driver);
}


static int pmem_probe(struct platform_device *pdev)
{
    struct android_pmem_platform_data *pdata;


    if (!pdev || !pdev->dev.platform_data) {
        pr_alert("Unable to probe pmem!\n");
        return -1;
    }
    pdata = pdev->dev.platform_data;


    pm_runtime_set_active(&pdev->dev);
    pm_runtime_enable(&pdev->dev);


    return pmem_setup(pdata, NULL, NULL);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值