parent
65a3be856f
commit
b9379a10e7
|
@ -150,7 +150,7 @@ void *ioremap(unsigned long bus_addr, size_t len)
|
||||||
LOG("bus_addr = %p len = %zx", (void *)bus_addr, len);
|
LOG("bus_addr = %p len = %zx", (void *)bus_addr, len);
|
||||||
dde_addr_t vaddr;
|
dde_addr_t vaddr;
|
||||||
|
|
||||||
int ret = dde_request_iomem(bus_addr, len, 0, &vaddr);
|
int ret = dde_request_iomem(bus_addr, &vaddr);
|
||||||
|
|
||||||
return ret ? 0 : (void *)vaddr;
|
return ret ? 0 : (void *)vaddr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -601,14 +601,14 @@ extern "C" void dde_slab_free(void *p) {
|
||||||
|
|
||||||
struct Io_memory
|
struct Io_memory
|
||||||
{
|
{
|
||||||
Genode::Io_mem_connection _mem;
|
Genode::Io_mem_session_client _mem;
|
||||||
Genode::Io_mem_dataspace_capability _mem_ds;
|
Genode::Io_mem_dataspace_capability _mem_ds;
|
||||||
|
|
||||||
Genode::addr_t _vaddr;
|
Genode::addr_t _vaddr;
|
||||||
|
|
||||||
Io_memory(Genode::addr_t base, Genode::size_t size, bool wc)
|
Io_memory(Genode::addr_t base, Genode::Io_mem_session_capability cap)
|
||||||
:
|
:
|
||||||
_mem(base, size, wc),
|
_mem(cap),
|
||||||
_mem_ds(_mem.dataspace())
|
_mem_ds(_mem.dataspace())
|
||||||
{
|
{
|
||||||
if (!_mem_ds.valid())
|
if (!_mem_ds.valid())
|
||||||
|
@ -625,16 +625,32 @@ struct Io_memory
|
||||||
static Io_memory *_io_mem;
|
static Io_memory *_io_mem;
|
||||||
|
|
||||||
|
|
||||||
extern "C" int dde_request_iomem(dde_addr_t start, dde_size_t size, int wc,
|
extern "C" int dde_request_iomem(dde_addr_t start, dde_addr_t *vaddr)
|
||||||
dde_addr_t *vaddr)
|
|
||||||
{
|
{
|
||||||
if (_io_mem) {
|
if (_io_mem) {
|
||||||
PERR("Io_memory already requested");
|
PERR("Io_memory already requested");
|
||||||
Genode::sleep_forever();
|
Genode::sleep_forever();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Pci::Device_client device(pci_drv()._cap);
|
||||||
|
Genode::Io_mem_session_capability cap;
|
||||||
|
|
||||||
|
Genode::uint8_t virt_iomem_bar = 0;
|
||||||
|
for (unsigned i = 0; i < Pci::Device::NUM_RESOURCES; i++) {
|
||||||
|
Pci::Device::Resource res = device.resource(i);
|
||||||
|
if (res.type() == Pci::Device::Resource::MEMORY) {
|
||||||
|
if (res.base() == start) {
|
||||||
|
cap = device.io_mem(virt_iomem_bar);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
virt_iomem_bar ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!cap.valid())
|
||||||
|
return -1;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
_io_mem = new (Genode::env()->heap()) Io_memory(start, size, !!wc);
|
_io_mem = new (Genode::env()->heap()) Io_memory(start, cap);
|
||||||
} catch (...) { return -1; }
|
} catch (...) { return -1; }
|
||||||
|
|
||||||
*vaddr = _io_mem->vaddr();
|
*vaddr = _io_mem->vaddr();
|
||||||
|
|
|
@ -118,7 +118,7 @@ void dde_slab_free(void *);
|
||||||
** I/O memory **
|
** I/O memory **
|
||||||
****************/
|
****************/
|
||||||
|
|
||||||
int dde_request_iomem(dde_addr_t, dde_size_t, int, dde_addr_t *);
|
int dde_request_iomem(dde_addr_t, dde_addr_t *);
|
||||||
int dde_release_iomem(dde_addr_t, dde_size_t);
|
int dde_release_iomem(dde_addr_t, dde_size_t);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
Loading…
Reference in New Issue