Board.KolibriOS.org

Official KolibriOS board
It is currently Wed Nov 20, 2019 5:55 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 40 posts ]  Go to page Previous 1 2 3
Author Message
PostPosted: Mon Oct 17, 2011 1:38 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1621
diamond'а нет, так что отвечать, видимо, придётся мне. В первых версиях ACPI регистр PM1a_CNT_BLK обязан был находиться в I/O пространстве, и на это рассчитывает код diamond'а, сейчас соответствующее поле в FADT всё ещё существует, но "is superseded by the X_PM1a_CNT_BLK field" в том же FADT; новое поле X_PM1a_CNT_BLK - уже стандартная для ACPI структура, умеющая описывать ресурсы в разнообразных пространствах, включая IO и MMIO.

Так всё-таки, где дамп FADT? В Linux его можно взять в /proc/acpi/fadt, в Windows - HKLM\HARDWARE\ACPI\FADT.

_________________
Сделаем мир лучше!


Top
   
PostPosted: Mon Oct 17, 2011 1:47 pm 
Offline
Kernel Developer
User avatar

Joined: Fri Aug 14, 2009 1:46 am
Posts: 1351
Нет у меня на E350 ни линукса, ни винды. И поставить пока не могу (встроенный он, долго отвинчивать).
Подскажите как эти таблицы из Колибри выцарапать -- где они лежат?


Top
   
PostPosted: Mon Oct 17, 2011 2:18 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1621
art_zh, если охота писать код на ассемблере, то берёшь код из kernel.asm между комментариями "scan for RSDP" и "ebx is linear address of FADT" и получаешь линейный адрес в ebx, размер в dword[ebx+4]. Если охота возиться с С, то Serge прокомментирует по acpica лучше меня.

_________________
Сделаем мир лучше!


Top
   
PostPosted: Mon Oct 17, 2011 3:37 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
AcpiGbl_FADT локальная копия FADT в ACPICA. Или воспользоваться drivers/devman/acpinfo. Таблица находится аналогично MADT. Переменная ядра acpi_rsdt_base хранит физический адрес RSDT. В исходниках L4:Ka есть вывод FADT.
Spoiler: Show
Code:
typedef struct __attribute__((packed))
{
    u32_t           sig;
    u32_t           len;
    u8_t            rev;
    u8_t            csum;
    char            oem_id[ACPI_OEM_ID_SIZE];
    char            oem_tid[ACPI_OEM_TABLE_ID_SIZE];
    u32_t           oem_rev;
    u32_t           creator_id;
    u32_t           creator_rev;
}acpi_thead_t;

typedef struct __attribute__((packed)){
    acpi_thead_t    Header;             /* Common ACPI table header */
    u32_t           Facs;               /* 32-bit physical address of FACS */
    u32_t           Dsdt;               /* 32-bit physical address of DSDT */
    u8_t            Model;              /* System Interrupt Model (ACPI 1.0) - not used in ACPI 2.0+ */
    u8_t            PreferredProfile;   /* Conveys preferred power management profile to OSPM. */
    u16_t           SciInterrupt;       /* System vector of SCI interrupt */
    u32_t           SmiCommand;         /* 32-bit Port address of SMI command port */
    u8_t            AcpiEnable;         /* Value to write to smi_cmd to enable ACPI */
    u8_t            AcpiDisable;        /* Value to write to smi_cmd to disable ACPI */
    u8_t            S4BiosRequest;      /* Value to write to SMI CMD to enter S4BIOS state */
    u8_t            PstateControl;      /* Processor performance state control*/
    u32_t           Pm1aEventBlock;     /* 32-bit Port address of Power Mgt 1a Event Reg Blk */
    u32_t           Pm1bEventBlock;     /* 32-bit Port address of Power Mgt 1b Event Reg Blk */
    u32_t           Pm1aControlBlock;   /* 32-bit Port address of Power Mgt 1a Control Reg Blk */
    u32_t           Pm1bControlBlock;   /* 32-bit Port address of Power Mgt 1b Control Reg Blk */
    u32_t           Pm2ControlBlock;    /* 32-bit Port address of Power Mgt 2 Control Reg Blk */
    u32_t           PmTimerBlock;       /* 32-bit Port address of Power Mgt Timer Ctrl Reg Blk */
    u32_t           Gpe0Block;          /* 32-bit Port address of General Purpose Event 0 Reg Blk */
    u32_t           Gpe1Block;          /* 32-bit Port address of General Purpose Event 1 Reg Blk */
    u8_t            Pm1EventLength;     /* Byte Length of ports at Pm1xEventBlock */
    u8_t            Pm1ControlLength;   /* Byte Length of ports at Pm1xControlBlock */
    u8_t            Pm2ControlLength;   /* Byte Length of ports at Pm2ControlBlock */
    u8_t            PmTimerLength;      /* Byte Length of ports at PmTimerBlock */
    u8_t            Gpe0BlockLength;    /* Byte Length of ports at Gpe0Block */
    u8_t            Gpe1BlockLength;    /* Byte Length of ports at Gpe1Block */
    u8_t            Gpe1Base;           /* Offset in GPE number space where GPE1 events start */
    u8_t            CstControl;         /* Support for the _CST object and C States change notification */
    u16_t           C2Latency;          /* Worst case HW latency to enter/exit C2 state */
    u16_t           C3Latency;          /* Worst case HW latency to enter/exit C3 state */
    u16_t           FlushSize;          /* Processor's memory cache line width, in bytes */
    u16_t           FlushStride;        /* Number of flush strides that need to be read */
    u8_t            DutyOffset;         /* Processor duty cycle index in processor's P_CNT reg*/
    u8_t            DutyWidth;          /* Processor duty cycle value bit width in P_CNT register.*/
    u8_t            DayAlarm;           /* Index to day-of-month alarm in RTC CMOS RAM */
    u8_t            MonthAlarm;         /* Index to month-of-year alarm in RTC CMOS RAM */
    u8_t            Century;            /* Index to century in RTC CMOS RAM */
    u16_t           BootFlags;          /* IA-PC Boot Architecture Flags. See Table 5-10 for description */
    u8_t            Reserved;           /* Reserved, must be zero */
    u32_t           Flags;              /* Miscellaneous flag bits (see below for individual flags) */
    acpi_address_t  ResetRegister;      /* 64-bit address of the Reset register */
    u8_t            ResetValue;         /* Value to write to the ResetRegister port to reset the system */
    u8_t            Reserved4[3];       /* Reserved, must be zero */
    u64_t           XFacs;              /* 64-bit physical address of FACS */
    u64_t           XDsdt;              /* 64-bit physical address of DSDT */
    acpi_address_t  XPm1aEventBlock;    /* 64-bit Extended Power Mgt 1a Event Reg Blk address */
    acpi_address_t  XPm1bEventBlock;    /* 64-bit Extended Power Mgt 1b Event Reg Blk address */
    acpi_address_t  XPm1aControlBlock;  /* 64-bit Extended Power Mgt 1a Control Reg Blk address */
    acpi_address_t  XPm1bControlBlock;  /* 64-bit Extended Power Mgt 1b Control Reg Blk address */
    acpi_address_t  XPm2ControlBlock;   /* 64-bit Extended Power Mgt 2 Control Reg Blk address */
    acpi_address_t  XPmTimerBlock;      /* 64-bit Extended Power Mgt Timer Ctrl Reg Blk address */
    acpi_address_t  XGpe0Block;         /* 64-bit Extended General Purpose Event 0 Reg Blk address */
    acpi_address_t  XGpe1Block;         /* 64-bit Extended General Purpose Event 1 Reg Blk address */
} acpi_fadt_t;

static void dump_fadt(acpi_fadt_t *fadt)
{

    printf("FACS base: %x DSDT base: %x\n", fadt->Facs, fadt->Dsdt);

    u8_t p = fadt->PreferredProfile;
    printf("PreferredProfile: %s\n" ,
            p == 0 ? "Unspecified"  :
            p == 1 ? "Desktop"      :
            p == 2 ? "Mobile"       :
            p == 3 ? "Workstation"  :
            p == 4 ? "Enterprise Server" :
            p == 5 ? "SOHO Server"  :
            p == 6 ? "Appliance PC" : "Unknown");

    printf("SciInterrupt:   %d\n"
           "SmiCommand:     %x\n"
           "AcpiEnable:     %x\n"
           "AcpiDisable:    %x\n"
           "S4BiosRequest:  %x\n"
           "PstateControl:  %x\n"
           "Pm1aEventBlock: %x\n"
           "Pm1bEventBlock: %x\n\n",
           fadt->SciInterrupt,
           fadt->SmiCommand,
           fadt->AcpiDisable,
           fadt->S4BiosRequest,
           fadt->PstateControl,
           fadt->Pm1aEventBlock,
           fadt->Pm1bEventBlock);
};

        fadt = (acpi_fadt_t*)rsdt_find(rsdt, 0x50434146);


Top
   
PostPosted: Sun Oct 23, 2011 9:26 pm 
Offline
Kernel Developer
User avatar

Joined: Fri Aug 14, 2009 1:46 am
Posts: 1351
CleverMouse wrote:
Так всё-таки, где дамп FADT? В Linux его можно взять в /proc/acpi/fadt, в Windows - HKLM\HARDWARE\ACPI\FADT.

Поставил на Е350 SuSe 11.4, в /proc вообще не оказалось подкаталога acpi :shock: .
Включил в GRUB опцию acpi=on, чтоб без вопросов -- то же самое.
Прилагаю /var/log/boot.msg, может там есть что-то полезное.

Дамп из-под Колибри пока не доделал, хронический цейтнот...


Attachments:
boot.7z [11.51 KiB]
Downloaded 200 times

_________________
Узкий специалист подобен флюсу: полнота его - односторонняя.
Козьма Прутков
Top
   
PostPosted: Mon Oct 24, 2011 1:48 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1621
Ох уж эти линуксы, вечно чего-нибудь меняют. Из лога видно только, что FADT находится по адресу 6fce38b0h и имеет длину 0F4h, а DSDT - 6fcde150h и имеет длину 575fh. Можно сдампить через dd if=/dev/mem of=fadt bs=1 skip=$((0x6fce38b0)) count=$((0xf4)), если, конечно, там и /dev/mem заодно не отменили, а ОС не потопталась по памяти из-под таблиц. Заодно уж и DSDT тогда можно сдампить, dd if=/dev/mem of=dsdt bs=1 skip=$((0x6fcde150)) count=$((0x575f)).

_________________
Сделаем мир лучше!


Top
   
PostPosted: Mon Oct 24, 2011 10:52 pm 
Offline
User avatar

Joined: Tue Aug 25, 2009 4:45 pm
Posts: 796
можно проще, через acpidump - сдампить те таблицы, которые надо указать.


Top
   
PostPosted: Thu Oct 27, 2011 12:33 pm 
Offline
Kernel Developer
User avatar

Joined: Fri Aug 14, 2009 1:46 am
Posts: 1351
Спасибо XVilka, через acpidump прошло (а через /dev/mem - нет).


Attachments:
dumpacpi.7z [30.39 KiB]
Downloaded 219 times

_________________
Узкий специалист подобен флюсу: полнота его - односторонняя.
Козьма Прутков
Top
   
PostPosted: Mon Nov 07, 2011 4:01 pm 
Offline
Kernel Developer
User avatar

Joined: Thu Sep 03, 2009 1:52 pm
Posts: 1621
Таблицы выглядят нормально. После подстановки констант код выключения по идее разворачивается в
Code:
; enter SCI mode
        mov     al, 0A0h
        out     0B2h, al
        mov     edx, 804h
@@:
        in      ax, dx
        test    al, 1
        jz      @b
; power off
        mov     edx, 804h
        in      ax, dx
        and     ax, 203h
        or      ah, 34h
        out     dx, ax
        jmp     $

Если запустить прямо такой код, он выключит машину, зависнет в первом цикле или зависнет на jmp $?

_________________
Сделаем мир лучше!


Top
   
PostPosted: Fri Feb 03, 2012 1:11 am 
Offline
Kernel Developer
User avatar

Joined: Fri Aug 14, 2009 1:46 am
Posts: 1351
Миль пардон, только сегодня увидел Ваш вопрос, набил ради интереса этот код и прогнал на реальном железе в Колибри-А (там in/out работает в юзермоде с любыми портами).

Машина зависла наглухо, но без отключки. Просто умерла с включенным экраном.
Когда решил оттрассировать по шагам в MTBEBUGе - машина совершенно правильно выключилась (с полной остановкой всего) на предпоследней команде, не доходя до jmp $ .
Выход из цикла произошёл на самом первом прогоне (ax == 0х0001)

Да, но я вообще-то не за этим сюда зашёл.

Я тут в последнее время изучаю (в жестко- :twisted:извращённой форме) несчастный Acer ao522. В целом - очень неплохая машинка, не сравнить со снулыми атомами. Колибри на ней завелась с пол-оборота, ATIшный драйвер работает изумительно (спасибо, Serge!), клавиатура и тачпад - в полном порядке. Только три минуса -

-1) USB-устройства (даже загрузочные флешки) не распознаются BIOSом ни при каких настройках. Чтобы загрузиться, приходится лезть в потроха, вытаскивать лицензионный NTFS-жд и ставить туда что-нибудь православное;

-2) сеть еще долго будет ждать своего драйвера; ну и наконец

-3) не выключается, зараза! - причем не только ACPI-отключка не пашет, но даже и мой "прямой" рубильник. Выпинывает на PEREGRUZKy

да и еще вот инфа по сабжу :
Quote:
говорят, обращение к отдельным портам, а также и ACPI-регистрам, может быть оформлено на IO_TRAP с автоматической генерацией SMI.

если это так, то все равно что есть ACPI-подсистема, что ее нет - нужен будет свой драйвер PM под конкретную невыключаемую платформу...


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 40 posts ]  Go to page Previous 1 2 3

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 3 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited