/kernel/branches/Kolibri-A/trunk/bus/pci/PCIe.inc |
---|
28,7 → 28,6 |
; |
;*************************************************************************** |
PCIe_CONFIG_SPACE equ 0xF0000000 ; to be moved to const.inc |
mmio_pcie_cfg_addr dd 0x0 ; intel pcie space may be defined here |
mmio_pcie_cfg_lim dd 0x0 ; upper pcie space address |
/kernel/branches/Kolibri-A/trunk/bus/pci/pci32.inc |
---|
8,11 → 8,13 |
;; ;; |
;; 32 bit PCI driver code ;; |
;; ;; |
;; Version 0.4 February 2nd, 2010 ;; |
;; Version 0.3 April 9, 2007 ;; |
;; Version 0.2 December 21st, 2002 ;; |
;; ;; |
;; Author: Victor Prodan, victorprodan@yahoo.com ;; |
;; Mihailov Ilia, ghost.nsk@gmail.com ;; |
;; Artem Jerdev, kolibri@jerdev.co.uk ;; |
;; Credits: ;; |
;; Ralf Brown ;; |
;; Mike Hibbett, mikeh@oceanfree.net ;; |
30,7 → 32,7 |
; Description |
; entry point for system PCI calls |
;*************************************************************************** |
;mmio_pci_addr equ 0x400 ; set actual PCI address here to activate user-MMIO |
mmio_pci_addr dw 0x400 ; default PCI device bdf-address |
align 4 |
76,7 → 78,6 |
cmp al,10 |
jz pci_write_reg ;dword |
if defined mmio_pci_addr |
cmp al,11 ; user-level MMIO functions |
jz pci_mmio_init |
cmp al,12 |
83,8 → 84,8 |
jz pci_mmio_map |
cmp al,13 |
jz pci_mmio_unmap |
end if |
no_pci_access_for_applications: |
or eax,-1 |
384,7 → 385,7 |
; |
; Description |
; IN: bx = device's PCI bus address (bbbbbbbbdddddfff) |
; Returns eax = user heap space available (bytes) |
; Returns eax = phys. address of user-accessible DMA block |
; Error codes |
; eax = -1 : PCI user access blocked, |
; eax = -2 : device not registered for uMMIO service |
391,7 → 392,7 |
; eax = -3 : user heap initialization failure |
;*************************************************************************** |
pci_mmio_init: |
cmp bx, mmio_pci_addr |
cmp bx, [mmio_pci_addr] |
jz @f |
mov eax,-2 |
ret |
399,6 → 400,7 |
call init_heap ; (if not initialized yet) |
or eax,eax |
jz @f |
mov eax, [UserDMAaddr] |
ret |
@@: |
mov eax,-3 |
412,10 → 414,9 |
; Description |
; maps a block of PCI memory to user-accessible linear address |
; |
; WARNING! This VERY EXPERIMENTAL service is for one chosen PCI device only! |
; The target device address should be set in kernel var mmio_pci_addr |
; |
; IN: ah = BAR#; |
; IN: ah = BAR#; or |
; IN: ah = 0xDA for DMA-mapping requests; |
; IN: ebx = block size (bytes); |
; IN: ecx = offset in MMIO block (in 4K-pages, to avoid misaligned pages); |
; |
432,11 → 433,20 |
pci_mmio_map: |
and edx,0x0ffff |
cmp ah, 0xDA |
jz .dma_map |
cmp ah,6 |
jc .bar_0_5 |
jz .bar_rom |
mov eax,-2 |
ret |
.dma_map: |
push ecx |
mov ecx,ebx |
mov eax,[UserDMAaddr] |
jmp .allocate_block |
.bar_rom: |
mov ah, 8 ; bar6 = Expansion ROM base address |
.bar_0_5: |
448,7 → 458,7 |
shl bl, 1 |
shl bl, 1 |
add bl, 0x10 ; now bl = BAR offset in PCI config. space |
mov ax, mmio_pci_addr |
mov ax, [mmio_pci_addr] |
mov bh, al ; bh = dddddfff |
mov al, 2 ; al : DW to read |
call pci_read_reg |
465,7 → 475,9 |
pop ecx ; ecx = block size, bytes (expanded to whole page) |
mov ebx, ecx ; user_alloc destroys eax, ecx, edx, but saves ebx |
and eax, 0xFFFFFFF0 |
push eax ; store MMIO physical address + keep 2DWords in the stack |
.allocate_block: |
push eax ; store MMIO physical address + keep the stack 2x4b deep |
stdcall user_alloc, ecx |
or eax, eax |
jnz mmio_map_over |
484,9 → 496,7 |
pop edx ; edx = MMIO shift (pages) |
shl edx, 12 ; edx = MMIO shift (bytes) |
add eax, edx ; eax = uMMIO physical address |
or eax, PG_SHARED |
or eax, PG_UW |
or eax, PG_NOCACHE |
or eax, (PG_SHARED+PG_UW+PG_NOCACHE) |
mov edi, ebx |
call commit_pages |
mov eax, edi |
/kernel/branches/Kolibri-A/trunk/const.inc |
---|
253,6 → 253,7 |
SCR_MODE equ (OS_BASE+0x000FE0C) |
LFBAddress equ (OS_BASE+0x000FE80) |
UserDMAaddr equ (OS_BASE+0x000FE84) |
BTN_ADDR equ (OS_BASE+0x000FE88) |
MEM_AMOUNT equ (OS_BASE+0x000FE8C) |
322,6 → 323,9 |
HEAP_BASE equ (OS_BASE+0x0800000) |
HEAP_MIN_SIZE equ 0x01000000 |
PCIe_CONFIG_SPACE equ 0xF0000000 |
USER_DMA_BUFFER equ 0xFD000000 ; linear addr. |
page_tabs equ 0xFDC00000 |
app_page_tabs equ 0xFDC00000 |
kernel_tabs equ (page_tabs+ (OS_BASE shr 10)) ;0xFDE00000 |
/kernel/branches/Kolibri-A/trunk/core/memory.inc |
---|
373,9 → 373,7 |
mov [pg_count], edi |
shr edi, 10 |
bt [cpu_caps], CAPS_PSE |
jnc .map_page_tables |
or esi, PG_LARGE+PG_UW |
or esi, PG_GLOBAL+PG_LARGE+PG_UW |
mov edx, sys_pgdir+(LFB_BASE shr 20) |
@@: |
mov [edx], esi |
384,39 → 382,29 |
dec edi |
jnz @B |
bt [cpu_caps], CAPS_PGE |
jnc @F |
or dword [sys_pgdir+(LFB_BASE shr 20)], PG_GLOBAL |
@@: |
mov dword [LFBAddress], LFB_BASE |
mov eax, cr3 ;flush TLB |
mov cr3, eax |
ret |
endp |
.map_page_tables: |
@@: |
call alloc_page |
stdcall map_page_table, edx, eax |
add edx, 0x00400000 |
dec edi |
jnz @B |
mov eax, [LFBAddress] |
mov edi, page_tabs + (LFB_BASE shr 10) |
or eax, PG_UW |
mov ecx, [pg_count] |
cld |
@@: |
stosd |
add eax, 0x1000 |
dec ecx |
jnz @B |
mov dword [LFBAddress], LFB_BASE |
mov eax, cr3 ;flush TLB |
mov cr3, eax |
align 4 |
proc init_userDMA |
stdcall alloc_pages, 4096 ; 16M <<<<<<<<<<+++++++++++++++++++++++++++++++++ |
add eax, 0x007FFFF0 |
and eax, 0xFF800000 ; align at 8M boundary |
mov [UserDMAaddr], eax |
or eax, PG_UW + PG_NOCACHE |
mov ebx, USER_DMA_BUFFER |
mov ecx, 2048 ; 8M, to be sure |
call commit_pages |
mov eax, [UserDMAaddr] |
or eax, PG_LARGE + PG_UW + PG_NOCACHE |
mov ebx, sys_pgdir + (USER_DMA_BUFFER shr 20) |
mov [ebx], eax |
add ebx, 4 |
add eax, 0x00400000 |
mov [ebx], eax |
ret |
endp |
/kernel/branches/Kolibri-A/trunk/init.inc |
---|
12,39 → 12,7 |
MEM_WC equ 1 ;write combined memory |
MEM_UC equ 0 ;uncached memory |
align 4 |
proc mem_test |
; if we have BIOS with fn E820, skip the test |
cmp dword [BOOT_VAR-OS_BASE + 0x9100], 0 |
jnz .ret |
mov eax, cr0 |
and eax, not (CR0_CD+CR0_NW) |
or eax, CR0_CD ;disable caching |
mov cr0, eax |
wbinvd ;invalidate cache |
xor edi, edi |
mov ebx, 'TEST' |
@@: |
add edi, 0x100000 |
xchg ebx, dword [edi] |
cmp dword [edi], 'TEST' |
xchg ebx, dword [edi] |
je @b |
and eax, not (CR0_CD+CR0_NW) ;enable caching |
mov cr0, eax |
inc dword [BOOT_VAR-OS_BASE + 0x9100] |
xor eax, eax |
mov [BOOT_VAR-OS_BASE + 0x9104], eax |
mov [BOOT_VAR-OS_BASE + 0x9108], eax |
mov [BOOT_VAR-OS_BASE + 0x910C], edi |
mov [BOOT_VAR-OS_BASE + 0x9110], eax |
.ret: |
ret |
endp |
align 4 |
proc init_mem |
; calculate maximum allocatable address and number of allocatable pages |
129,8 → 97,6 |
rep stosd |
mov edx, (sys_pgdir-OS_BASE)+ 0x800; (OS_BASE shr 20) |
bt [cpu_caps-OS_BASE], CAPS_PSE |
jnc .no_PSE |
mov ebx, cr4 |
or ebx, CR4_PSE |
142,20 → 108,6 |
add edx, 4 |
mov edi, [tmp_page_tabs] |
jmp .map_kernel_heap ; new kernel fits to the first 4Mb - nothing to do with ".map_low" |
.no_PSE: |
mov eax, PG_SW |
mov ecx, [tmp_page_tabs] |
shr ecx, 12 |
.map_low: |
mov edi, [tmp_page_tabs] |
@@: ; |
stosd |
add eax, 0x1000 |
dec ecx |
jnz @B |
.map_kernel_heap: |
mov ecx, [pg_data.kernel_tables-OS_BASE] |
shl ecx, 10 |
xor eax, eax |
/kernel/branches/Kolibri-A/trunk/kernel.asm |
---|
1,6 → 1,6 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
;; |
;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. |
;; Copyright (C) KolibriOS team 2004-2010. All rights reserved. |
;; PROGRAMMING: |
;; Ivan Poddubny |
;; Marat Zakiyanov (Mario79) |
19,6 → 19,7 |
;; SPraid (simba) |
;; Hidnplayr |
;; Alexey Teplov (<Lrz>) |
;; Artem Jerdev (art_zh) |
;; |
;; Data in this file was originally part of MenuetOS project which is |
;; distributed under the terms of GNU GPL. It is modified and redistributed as |
249,7 → 250,6 |
call init_BIOS32 |
; MEMORY MODEL |
call mem_test |
call init_mem |
call init_page_map |
850,6 → 850,9 |
call set_network_conf |
no_st_network: |
call init_userDMA ; <<<<<<<<< ================ core/memory.inc ======================================== |
call pci_ext_config ; <<<<<<<<< bus/pci/pcie.inc |
; LOAD FIRST APPLICATION |
cli |
/kernel/branches/Kolibri-A/trunk/kernel32.inc |
---|
268,8 → 268,8 |
include "gui/skincode.inc" |
; Pci functions |
include "bus/pci/pci32.inc" |
include "bus/pci/pcie.inc" |
; Floppy drive controller |