diff --git a/ChangeLog b/ChangeLog index 2ff66607f..7f1cf0e53 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2013-11-18 Vladimir Serbinenko + + On i386-ieee1275 we run in paged mode. So we need to explicitly map + the devices before accessing them. + 2013-11-18 Vladimir Serbinenko * grub-core/lib/relocator.c (grub_mm_check_real): Accept const char * diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def index 4fff57f16..5cd84b183 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def @@ -563,6 +563,7 @@ module = { module = { name = pci; common = bus/pci.c; + i386_ieee1275 = bus/i386/ieee1275/pci.c; enable = i386_pc; enable = i386_ieee1275; diff --git a/grub-core/bus/i386/ieee1275/pci.c b/grub-core/bus/i386/ieee1275/pci.c new file mode 100644 index 000000000..1fd3b5610 --- /dev/null +++ b/grub-core/bus/i386/ieee1275/pci.c @@ -0,0 +1,42 @@ +/* + * GRUB -- GRand Unified Bootloader + * Copyright (C) 2013 Free Software Foundation, Inc. + * + * GRUB is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * GRUB is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GRUB. If not, see . + */ + +#include +#include +#include +#include +#include + +volatile void * +grub_pci_device_map_range (grub_pci_device_t dev __attribute__ ((unused)), + grub_addr_t base, + grub_size_t size) +{ + if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_REAL_MODE)) + return (volatile void *) base; + if (grub_ieee1275_map (base, base, size, 7)) + grub_fatal ("couldn't map 0x%lx", base); + return (volatile void *) base; +} + +void +grub_pci_device_unmap_range (grub_pci_device_t dev __attribute__ ((unused)), + volatile void *mem __attribute__ ((unused)), + grub_size_t size __attribute__ ((unused))) +{ +} diff --git a/include/grub/i386/pci.h b/include/grub/i386/pci.h index 795dec58b..dffeb5695 100644 --- a/include/grub/i386/pci.h +++ b/include/grub/i386/pci.h @@ -70,6 +70,8 @@ grub_pci_write_byte (grub_pci_address_t addr, grub_uint8_t data) grub_outb (data, GRUB_PCI_DATA_REG + (addr & 3)); } +#ifndef GRUB_MACHINE_IEEE1275 + static inline volatile void * grub_pci_device_map_range (grub_pci_device_t dev __attribute__ ((unused)), grub_addr_t base, @@ -85,5 +87,19 @@ grub_pci_device_unmap_range (grub_pci_device_t dev __attribute__ ((unused)), { } +#else + +volatile void * +grub_pci_device_map_range (grub_pci_device_t dev, + grub_addr_t base, + grub_size_t size); + +void +grub_pci_device_unmap_range (grub_pci_device_t dev, + volatile void *mem, + grub_size_t size); + +#endif + #endif /* GRUB_CPU_PCI_H */