IORESOURCE_X 对应含义

来源:互联网 发布:程序员 app 编辑:程序博客网 时间:2024/05/18 19:22
我们知道IORESOURCE_X 有很多种,但是每种代表的意思有时候不是很明确,还是需要看code才能知道具体的意思
这里以request_standard_resources为例
static void __init request_standard_resources(void)
{
    struct memblock_region *region;
    struct resource *res;

    kernel_code.start   = virt_to_phys(_text);
    kernel_code.end     = virt_to_phys(__init_begin - 1);
    kernel_data.start   = virt_to_phys(_sdata);
    kernel_data.end     = virt_to_phys(_end - 1);

    for_each_memblock(memory, region) {
        res = alloc_bootmem_low(sizeof(*res));
        if (memblock_is_nomap(region)) {
            res->name  = "reserved";
            res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
        } else {
            res->name  = "System RAM";
            res->flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;
        }
        res->start = __pfn_to_phys(memblock_region_memory_base_pfn(region));
        res->end = __pfn_to_phys(memblock_region_memory_end_pfn(region)) - 1;

        request_resource(&iomem_resource, res);

        if (kernel_code.start >= res->start &&
            kernel_code.end <= res->end)
            request_resource(res, &kernel_code);
        if (kernel_data.start >= res->start &&
            kernel_data.end <= res->end)
            request_resource(res, &kernel_data);
    }
}
可以看出如果memblock_is_nomap 返回true 则认为这段memory是reserved,其flag就对应的是IORESOURCE_MEM | IORESOURCE_BUSY。反之如果memory含有IORESOURCE_MEM | IORESOURCE_BUSY也就说明这个memory是reserved
同理可以看出系统memory是IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY;的,反之既然。
从这里看出region中memblock_type为memory的就分为两类,reserved和 system ram
static inline bool memblock_is_nomap(struct memblock_region *m)
{
    return m->flags & MEMBLOCK_NOMAP;
}
其判断标准就是看是否有MEMBLOCK_NOMAP。
从acpi_dev_filter_resource_type 可以看出其他几个IORESOURCE赋值的情况
int acpi_dev_filter_resource_type(struct acpi_resource *ares,
                  unsigned long types)
{
    unsigned long type = 0;

    switch (ares->type) {
    case ACPI_RESOURCE_TYPE_MEMORY24:
    case ACPI_RESOURCE_TYPE_MEMORY32:
    case ACPI_RESOURCE_TYPE_FIXED_MEMORY32:
        type = IORESOURCE_MEM;
        break;
    case ACPI_RESOURCE_TYPE_IO:
    case ACPI_RESOURCE_TYPE_FIXED_IO:
        type = IORESOURCE_IO;
        break;
    case ACPI_RESOURCE_TYPE_IRQ:
    case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
        type = IORESOURCE_IRQ;
        break;
    case ACPI_RESOURCE_TYPE_DMA:
    case ACPI_RESOURCE_TYPE_FIXED_DMA:
        type = IORESOURCE_DMA;
        break;
    case ACPI_RESOURCE_TYPE_GENERIC_REGISTER:
        type = IORESOURCE_REG;
        break;
    case ACPI_RESOURCE_TYPE_ADDRESS16:
    case ACPI_RESOURCE_TYPE_ADDRESS32:
    case ACPI_RESOURCE_TYPE_ADDRESS64:
    case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
        if (ares->data.address.resource_type == ACPI_MEMORY_RANGE)
            type = IORESOURCE_MEM;
        else if (ares->data.address.resource_type == ACPI_IO_RANGE)
            type = IORESOURCE_IO;
        else if (ares->data.address.resource_type ==
             ACPI_BUS_NUMBER_RANGE)
            type = IORESOURCE_BUS;
        break;
    default:
        break;
    }

    return (type & types) ? 0 : 1;
}